【问题标题】:Android - How does uiThread block executes?Android - uiThread 块如何执行?
【发布时间】:2018-03-01 00:09:02
【问题描述】:
doAsync {
    doSomethingAsync()
    uiThread {
        doSomethingUiThread()
    }
}

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

【问题讨论】:

    标签: android asynchronous kotlin ui-thread


    【解决方案1】:

    我听说RunOnUiThread 方法将runnable(kotlin 中的{} 块)发布到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的出口,但希望我的回答对你有所帮助。

    【讨论】:

    • 所以它只是尽快执行。
    【解决方案2】:

    它向 ui 线程上的 looper 发送一条消息,并通过 runOnUiThread 块中的代码向它传递一个 Runnable

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多