在不使用Handler的情况下将runnable附加到UI线程

时间:2015-10-18 01:48:55

标签: android concurrency android-asynctask

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

我们有一个异步任务,它接受三个参数。 progress参数(即第二个参数是)是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()调用此方法。

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

有些人可以指导我做一个更好的方法,而不是创建一个处理程序

2 个答案:

答案 0 :(得分: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。

答案 1 :(得分:0)

根据文件

<强> onProgressUpdate

  

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

您可以在此处找到AsyncTask

链接

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

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