【问题标题】:Attach a runnable to UI thread without using Handler在不使用 Handler 的情况下将可运行对象附加到 UI 线程
【发布时间】:2015-10-18 01:48:54
【问题描述】:

我会直截了当地说这是一个作业问题。所以我不是在寻找答案,而是在寻找更好的答案。

我们有一个异步任务,它接受三个参数。进度参数(即第二个参数是)是 Runnable 。

@Override
    public void onProgressUpdate(Runnable ...runnableCommands) {
        // TODO -- you fill in here with the appropriate call to
        // the runnableCommands that will cause the progress
        // update to be displayed in the UI thread.
    }

我可以在 doInBackGround() 方法中使用 publishProgress() 调用此方法。

挑战在于将此可运行对象附加到 UI 线程。我知道 onProgressUpdate() 可以访问 UI 线程,我们可以创建一个处理程序来添加到消息队列。但显然是过分了。

能否指导我找到比创建处理程序更好的方法

【问题讨论】:

标签: android concurrency android-asynctask


【解决方案1】:

如果你有一个 Activity 的引用,一个简单的方法是使用 runOnUiThread(Runnable runnable) 方法。查看源代码,很容易看出原因:

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

如果您只有一个视图的引用,您可以使用post(Runnable runnable) 方法。

两个状态的 JavaDoc Runnable 将在主线程上执行。

【讨论】:

    【解决方案2】:

    根据文档

    onProgressUpdate

    可以从 doInBackground(Params...) 调用此方法,以便在后台计算仍在运行时在 UI 线程上发布更新。

    你可以在这里找到一个链接AsyncTask

    基本上这个方法已经在 UI 线程上运行了。所以你不需要任何进一步的代码(通过handelrs或runOnUiThread())。

    在您的情况下,您可以直接调用该 Runnable 的 run

    【讨论】:

      猜你喜欢
      • 2014-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-13
      相关资源
      最近更新 更多