Android - uiThread block 如何执行?

标签 android asynchronous kotlin ui-thread

doAsync {
    doSomethingAsync()
    uiThread {
        doSomethingUiThread()
    }
}

基于上面的代码。我知道 doAsync 创建一个线程并在该新线程中执行其 block 内的代码。此外,uiThread 在主 UI 线程中执行其代码块。但是代码如何在一个已经存在的线程中执行呢?我的意思是 UI 线程已经在执行代码(例如接收输入事件、创建新 Activity 等),那么代码是如何执行的呢?它只是停止所有其他 UI 线程代码,执行自身然后返回到其他代码?或类似的东西?请赐教。

最佳答案

我听说 RunOnUiThread 方法将 runnable(kotlin 中的 {} block )发送到 UI 线程的 handler。然后UI线程会在不忙的时候执行runnable.run()方法。如您所知,必须有一段时间 UI 线程不忙,因为如果不忙,系统会显示 ANR(应用程序未响应)消息(甚至会抛出Exceptions 当 UI 线程尝试运行耗时(滞后)的作业,如网络 :))。

**编辑** 这是一个 java 代码,向您展示了 runOnUiThread 的工作原理。 引自 this blog (Korean)

@Override
public final void runOnUiThread(Runnable action)
{
    if (Thread.currentThread() !=mUiThread)
    {
        mHandler.post(action);
    }
    else
    {
        action.run();
    }
}

附言我不是 Kotlin 的导出,但我希望我的回答对你有帮助。

关于Android - uiThread block 如何执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49040687/

相关文章:

android - "Cannot override the final method from SherlockActivity"

c# - 无阻塞的顺序异步任务

collections - 如何在 Kotlin 中无限重复序列?

kotlin - Kotlin中的内联构造函数是什么?

java - BackStackEntryCount 和 FragmentManager

android - Sqlite 数据库查询在获取时出现一些问题

java - 将自动重试添加到 Android 下载管理器

mysql - 从 dispatch_group_notify 返回值

javascript - 使用 PHP 中 Javascript 函数末尾生成的数据

android - 有没有办法限制应用程序在 Play 商店的下载量?