doAsync {
doSomethingAsync()
uiThread {
doSomethingUiThread()
}
}
基于上面的代码。我理解doAsync
创建一个线程并在该新线程中执行其块内的代码。此外,uiThread
在主UI线程中执行其块代码。但是代码如何在已经存在的线程中执行?我的意思是UI线程已经在执行代码(例如,接收输入事件,创建新活动等),那么代码是如何执行的?它只是停止所有其他UI线程代码,执行自己然后返回到其他代码?或类似的东西?请赐教。
答案 0 :(得分:2)
我听说RunOnUiThread
方法将runnable
(kotlin中的{}块)发布到UI线程的handler
。然后UI线程将在不忙时执行runnable.run()
方法。如你所知,必须当UI线程我们不忙时,因为如果没有,它将导致系统显示ANR(应用程序没有响应)消息(甚至它会抛出Exception
当UI线程试图运行耗时(滞后)的工作,如网络:))。
**编辑**
这是一个java代码,向您展示runOnUiThread
的工作原理。
引自this blog (Korean)
@Override
public final void runOnUiThread(Runnable action)
{
if (Thread.currentThread() !=mUiThread)
{
mHandler.post(action);
}
else
{
action.run();
}
}
P.S。我不是kotlin的出口,但我希望我的回答对你有帮助。
答案 1 :(得分:2)
它在ui线程上向looper发布一条消息,并在runOnUiThread块中传递一个带有代码的Runnable