我使用后台线程做一些工作。在特定条件下,我会触发一个自定义事件来通知所有听众。
我的问题是我需要在主线程(注册到事件)中调用该事件处理程序而不是后台线程(触发事件)。
代码说明如果有用:
背景课程
public class Background implements Runnable {
public Background() {
Thread worker = new Thread(Background.this);
worker.start();
}
@Override
public void run() {
// some work here
boolean isDone = true;
if (isDone) {
fireEvent(new Object());
}
}
public interface MyEventListener {
public void onNewEvent(Object obj);
}
private final ArrayList<MyEventListener> listeners = new ArrayList<Background.MyEventListener>();
public boolean registerEvent(MyEventListener listener) {
return listeners.add(listener);
}
private void fireEvent(Object obj) {
// fire event called in the background thread
for (MyEventListener listener : listeners) {
listener.onNewEvent(obj);
}
}
}
前台课程
public class Foreground implements MyEventListener {
Background back = new Background();
public Foreground() {
back.registerEvent(Foreground.this);
}
@Override
public void onNewEvent(Object obj) {
// I need this function to be called in the main thread which initiated this class
}
}
答案 0 :(得分:0)
我建议使用Android SDK中的Loopers和Handler。这是dev docs的一个例子:
class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare();
mHandler = new Handler() {
public void handleMessage(Message msg) {
// process incoming messages here
}
};
Looper.loop();
}
}
在此示例中,Handler实例绑定到创建它的Thread(LooperThread)。稍后您可以从另一个线程获取Handler实例并向其发送消息。消息将在handleMessage()内调度,即在LooperThread内。
所以,在你的另一个线程中你可以做这样的事情(伪代码):
class MyOtherThread{
public void run(){
Handler handler = LooperThread.getHandler();
handler.sendMessage(...);
}
}