关于我们何时需要在android应用程序中使用runOnUiThread?的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于AndroidJavarunOnUiThread()、androi
关于我们何时需要在android应用程序中使用runOnUiThread?的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于Android Java runOnUiThread()、android – 为什么runOnUiThread()在服务中不起作用?、android – 在线程上的robolectric runOnUiThread不起作用、android – 如何单独测试`runOnUiThread`中包含的代码?等相关知识的信息别忘了在本站进行查找喔。
本文目录一览:- 我们何时需要在android应用程序中使用runOnUiThread?
- Android Java runOnUiThread()
- android – 为什么runOnUiThread()在服务中不起作用?
- android – 在线程上的robolectric runOnUiThread不起作用
- android – 如何单独测试`runOnUiThread`中包含的代码?
我们何时需要在android应用程序中使用runOnUiThread?
我有一个使用此函数运行线程的代码示例runOnUiThread
。我们为什么以及何时需要使用它?
编辑
怎么样来使用AsyncTask
类,什么是pros
和cons
?
答案1
小编典典runOnUiThread()
当您要从非UI线程更新UI时必须使用。例如-如果您想从后台线程更新UI。您也可以将其Handler
用于同一件事。
从文档-
在UI线程上运行指定的操作。如果当前线程是UI线程,则立即执行该操作。如果当前线程不是UI线程,则将操作发布到UI线程的事件队列。
句法 -
Activity_Name.this.runOnUiThread(new Runnable() { @Override public void run() { // your stuff to update the UI } });
更新-
AsyncTask -
如果您要执行某些
Networkoperation
阻止UI的操作,那么AsyncTask是最佳选择。还有其他几种方法可以执行与您可以使用的相同的后台操作Service
,IntentService
也可以执行后台操作。使用AsyncTask可以帮助您完成UI工作,并且在进行后台操作之前不会阻塞UI。
从文档-
通过AsyncTask,可以正确,轻松地使用UI线程。此类允许执行后台操作并在UI线程上发布结果,而无需操纵线程和/或处理程序。
Android Java runOnUiThread()
我一直在弄乱runOnUiThread方法。如果我只是在活动中创建一个方法:
public void Test(){ runOnUiThread(new Runnable() { public void run() { Log.v("mainActivity", "test"); } }); }
我注意到该可运行对象仅运行一次。但是,这不是问题。我想知道的是,如果我完全遗漏了某些东西,并且它在后台执行了某些操作,当我多次执行该方法时,它将导致帧速率下降。
答案1
小编典典这是Activity.runOnUiThread(Runnable)的全文:
public final void runOnUiThread(Runnable action) { if (Thread.currentThread() != mUiThread) { mHandler.post(action); } else { action.run(); }}
该方法的主体是在你的后台线程仍然执行,类mHandler
android.os.Handler实现了的Runnable内部队列中的发布到它,所以,除非你正在做的工作,堵在了Runnable(这是一个
很大的 不不上(UI线程)或在短时间内调用此方法一千次以上,您应该不会看到任何区别。
现在,如果您正在调用Handler.postAtFrontOfQueue(Runnable),那么就会出现问题,因为您的Runnable本质上是“
插队
”。在这种情况下,这可能会导致结结,因为正在执行您的Runnable而不是需要进行的任何UI更新(如滚动)。
请注意,您只 需要 在UI线程上运行UI更新,例如在View上调用任何方法(因此称为“ UI
Thread”以及该方法的存在原因)或文档明确指出需要在其上运行的任何操作。 UI线程。否则,如果您已经在使用后台线程,则没有真正的理由离开它。
android – 为什么runOnUiThread()在服务中不起作用?
我正在创建一个应用程序,即使应用程序没有运行,也需要每分钟更新一次值.
当然,我已经设置了一个简单的服务来做到这一点.我设置了调试消息,告诉我服务何时启动,何时更新(每分钟)以及何时关闭.我还有一条消息告诉我何时在runOnUiThread()方法中更新值.除runOnUiThread()中的消息外,我的所有消息都会激活.有什么我做错了(当然有)?我需要改变什么?
码:
@Override
public void handleMessage(Message message) {
try {
if (!serviceStarted) {
serviceStarted = true;
serviceTest = true;
while (serviceStarted) {
new MainActivity().runOnUiThread(new Runnable() {
public void run() {
OverviewFragment.refresh(getApplicationContext());
System.out.println("yay");
}
});
Thread.sleep(((1 /* minutes */) * 60 * 1000));
System.out.println("Updated values through service.");
}
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
e.printstacktrace();
}
stopSelf(message.arg1);
}
解决方法:
So there’s no need to do that, unless you’re creating a Thread inside
of it
Gabe Sechan的回答是正确的.
但是,如果您使用单独的线程,而不是遵循代码:
new MainActivity().runOnUiThread(new Runnable() {
public void run() {
OverviewFragment.refresh(getApplicationContext());
System.out.println("yay");
}
});
试试,这段代码:
new Handler(Looper.getMainLooper()).post(new Runnable() {
public void run() {
OverviewFragment.refresh(getApplicationContext());
System.out.println("yay");
}
});
按照Android docs
Caution: A service runs in the main thread of its hosting process—the
service does not create its own thread and does not run in a separate
process (unless you specify otherwise).
android – 在线程上的robolectric runOnUiThread不起作用
runOnUiThread()在线程中执行时似乎不起作用.有人知道一个变通方法吗?
注意:我在这里提交了一张票 – https://github.com/robolectric/robolectric/issues/2479
import android.app.Activity;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricGradleTestRunner;
import org.robolectric.annotation.Config;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import static org.junit.Assert.assertTrue;
@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 21)
public class RunOnUiThreadTest {
/**
* Works
* @throws Exception
*/
@Test
public void inside_the_main_thread() throws Exception {
final Activity activity = Robolectric.setupActivity(Activity.class);
final CountDownLatch latch = new CountDownLatch(1);
final AtomicBoolean didRun = new AtomicBoolean(false);
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
didRun.set(true);
latch.countDown();
}
});
latch.await(20, TimeUnit.SECONDS);
assertTrue(didRun.get());
}
/**
* Fails
* @throws Exception
*/
@Test
public void inside_a_new_thread() throws Exception {
final Activity activity = Robolectric.setupActivity(Activity.class);
final CountDownLatch latch = new CountDownLatch(1);
final AtomicBoolean didRun = new AtomicBoolean(false);
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
didRun.set(true);
latch.countDown();
}
});
}
});
thread.start();
latch.await(20, TimeUnit.SECONDS);
assertTrue(didRun.get());
}
}
解决方法:
由于第二个测试阻止了运行目标Runnable所需的UI线程,因此测试结果可能正如预期的那样.
第一个测试将通过,因为整个方法是同步执行的.由于您已经在UI线程上,因此在调用activity.runOnUiThread(…)时,将立即执行Runnable.由于锁存器是0,latch.await(20,TimeUnit.SECONDS)立即返回,并且断言为真.
在第二个示例中,您启动一个新线程并从其中调用activity.runOnUiThread(…).由于您不在UI线程上,因此Runnable将发布到UI线程上的Handler,以便将来异步执行.此时你继续调用latch.await(20,TimeUnit.SECONDS);来自UI线程,这意味着在此期间Runnable无法运行,因为您阻止了UI线程.
20秒后,线程恢复,但Runnable从未有机会运行,因此断言失败,因为didRun()从未设置为true.
下面是一个更新的测试,允许使用runOnUiThread()发布的Runnable运行.
@Test
public void inside_a_new_thread() throws Exception {
final Activity activity = Robolectric.setupActivity(Activity.class);
final CountDownLatch latch = new CountDownLatch(1);
final AtomicBoolean didRun = new AtomicBoolean(false);
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
didRun.set(true);
latch.countDown();
}
});
}
});
thread.start();
// sleep current thread to give the new thread a chance to run and post the runnable
Thread.sleep(1000);
// This method will cause the runnable to be executed
Robolectric.flushForegroundThreadScheduler();
// Should immediately return since the runnable has been executed
latch.await(20, TimeUnit.SECONDS);
assertTrue(didRun.get());
}
android – 如何单独测试`runOnUiThread`中包含的代码?
我有一个调用runOnUiThread的函数,如下所示
fun myFunction(myObject: MyClass, view: MyView) {
// Do something
view.getActivity().runOnUiThread {
myObject.myObjectFunction()
}
}
我想使用UnitTest myFunction来确保myObject调用myObjectFunction.但鉴于它是在runOnUiThread中包装,我无法达到它.
我如何进行单元测试以确保调用runOnUiThread中的代码?
解决方法:
管理以找到使用ArgumentCaptor执行测试的方法.在runOnUiThread()函数中捕获Runnable,然后通过runOnUiArgCaptor.value.run()触发运行
import com.nhaarman.mockito_kotlin.argumentCaptor
import com.nhaarman.mockito_kotlin.verify
import com.nhaarman.mockito_kotlin.whenever
import org.junit.Before
import org.junit.Test
import org.mockito.Mock
@Mock lateinit var activity: Activity
@Mock lateinit var view: MyView
@Mock lateinit var myObject: MyObject
@Before
fun setUp() {
MockitoAnnotations.initMocks(this)
}
@Test
fun my_test_function() {
whenever(view.getActivity()).thenReturn(activity)
val runOnUiArgCaptor = argumentCaptor<Runnable>()
val myTestObject = TestObject()
myTestObject.myFunction(myObject, view)
verify(activity).runOnUiThread(runOnUiArgCaptor.capture())
runOnUiArgCaptor.value.run()
verify(myObject).myObjectFunction()
}
今天的关于我们何时需要在android应用程序中使用runOnUiThread?的分享已经结束,谢谢您的关注,如果想了解更多关于Android Java runOnUiThread()、android – 为什么runOnUiThread()在服务中不起作用?、android – 在线程上的robolectric runOnUiThread不起作用、android – 如何单独测试`runOnUiThread`中包含的代码?的相关知识,请在本站进行查询。
本文标签: