android - 在另一个线程上接收自定义事件

时间:2014-03-22 12:06:09

标签: android multithreading event-handling runnable

我使用后台线程做一些工作。在特定条件下,我会触发一个自定义事件来通知所有听众。

我的问题是我需要在主线程(注册到事件)中调用该事件处理程序而不是后台线程(触发事件)。

代码说明如果有用:

背景课程

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
        }
    }

1 个答案:

答案 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(...);
    }
}