【问题标题】:Difference between Handler.post(Runnable r) and Activity.runOnUiThread(Runnable r) [duplicate]Handler.post(Runnable r) 和 Activity.runOnUiThread(Runnable r) 之间的区别 [重复]
【发布时间】:2011-09-17 06:16:02
【问题描述】:

有区别吗

new Handler.post(Runnable r);

activity.runOnUiThread(Runnable r)

【问题讨论】:

    标签: android handler ui-thread


    【解决方案1】:

    来自官方Handler docs

    处理程序

    处理程序有两个主要用途:

    (1) 安排消息和可运行文件作为某个时间点执行 未来。

    (2) 将要在不同线程上执行的操作排入队列 你自己的。

    简而言之,Handler就是用来管理不同的Runnables的。

    runOnUiThread

    用于对UI Thread执行非UI操作,示例 如果你想从 AsyncTask 的 doInBackground() 更新屏幕 您必须编写更新 UI 内部的代码部分 运行OnUiThread()。但这又会阻止 UI。

    【讨论】:

    • @Lalit - 很好的答案。您能否告诉我 runOnUiThread 是否可能会阻塞 UI(例如,冻结手机)?
    • 这似乎不正确,如果在 runOnUiThread 中执行的任务花费的时间足够长,那么它会阻塞 UI 线程。
    • @Aleross 你不应该在 runOnUiThread 上运行繁重的任务,只是为了“快速”更新 ui。
    【解决方案2】:

    runOnUiThread 基本上适合在调用AsyncTask 之前显示进度对话框或进行一些 UI 操作。 如果您想在线程执行过程中更新 UI,那么最好的方法是创建一个 Handler 来更新您的 UI,并让线程继续运行,例如,在执行几次后定期更新文本视图秒,比如说计时器功能。

    【讨论】:

    • 这个答案还没有解释它们之间的真正区别。
    • 线程中的 activity.runOnUiThread(Runnable r) 的问题是您必须将活动的引用传递给线程......这不是一个好的设计作为活动可以在线程继续运行时销毁。
    【解决方案3】:

    Handler 附加到创建它的线程。

    handler.post(Runnable) 可用于在 Handler 所附加的线程上运行代码。

    Activity.runOnUIThread(Runnable) 总是在活动的 UIThread 上运行给定的可运行对象。在内部,它是通过一个处理程序 Activity 在构造时创建的:

    final Handler mHandler = new Handler();
    

    因此 runonUiThrad 代码如下所示:

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

    您可以看到当前线程是否不是 UI 线程,它会将给定的 runnable 发布到我们之前提到的成员处理程序上。 如果调用者已经在 ui 线程上,它只会调用 runnable。

    Rad 代码here

    【讨论】:

      猜你喜欢
      • 2012-03-20
      • 2014-02-07
      • 2014-07-22
      • 2013-07-02
      • 1970-01-01
      • 2023-02-02
      • 1970-01-01
      • 1970-01-01
      • 2011-06-25
      相关资源
      最近更新 更多