使用事件监听器的Android多线程

4
我在我的Android应用程序中有UI线程(显然),还有其他一些线程用于执行一些工作。在我的UI线程中有监听器等待其他线程中的工作完成(我们称之为workComplete事件)。
我在这里遇到了一个问题。当我的监听器接收到调用时,当前线程是工作线程,而不是UI线程。因此,如果我尝试做一些应该来自UI线程的事情(修改视图等),它会出现错误或警告。
我的问题是:最好的方法是什么?我希望在工作完成并调用监听器的workComplete事件时回到UI线程。
谢谢!

1
一种方法是使用 Handler。您还可以使用 greenrobots 的易于使用的 EventBus。https://github.com/greenrobot/EventBus - Raghunandan
3个回答

2

常用的方法来回到UI线程的是使用一个最初在UI线程上创建的Handler来进行投递:

//create thread on UI Thread (associates with Looper)
Handler handler = new Handler();

//then use it in a background thread
handler.post(new Runnable(){
    public void run(){
        //back on UI thread...
    }
}

2
您可以使用Activity类中的runOnUiThread()方法。
根据文档:

void android.app.Activity.runOnUiThread(Runnable action)

在UI线程上运行指定的操作。如果当前线程是UI线程,则立即执行该操作。如果当前线程不是UI线程,则将该操作发布到UI线程的事件队列中。

参数:action 在UI线程上运行的操作

因此,在您的workComplete事件中:
runOnUiThread(new Runnable() {
    public void run() {
         // Do some cool UI stuff here ...
    }
}

如果您正在片段内部,可以调用getActivity().runOnUiThread(runnable)

-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接