从服务到活动的线程获取处理程序

时间:2013-10-23 12:10:06

标签: java android multithreading android-service handler

情况:

  1. 活动绑定到已启动的前台服务。
  2. 服务将本地活页夹分发给活动。
  3. activity通过getService()调用获取对服务的引用。
  4. 活动希望使用消息与服务中运行的线程直接进行通信。它从活动中调用mService.getThreadHandler()方法。
  5. 问题:

    • 如何从当前运行的线程中获取Handler到活动活动中,以便我可以直接将消息发布到线程messagequeue?

    我不知道在服务中使用什么信使,我想直接与活动方面的服务中的线程进行通信。

    编辑:活动通过调用以下内容获取服务中线程本身的处理程序:

    活动代码:

    Handler mServiceThreadHandler;
    ServiceConnection mServiceConnection;
    
    public void onStart() {
      if (!bindService(new Intent(this, MainService.class), mServiceConnection,    Context.BIND_AUTO_CREATE)) 
      {
        Log.e(TAG, "Client did not bind to Service!");
      } 
      super.onStart();
    }
    
    public class MyLocalServiceConnection implements ServiceConnection {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            LocalBinder binder = (LocalBinder) service;
            mService = (MainService) binder.getService();
                        // the handler of the service is actually a handler of a thread
                        // within the service, and is set automatically within the binding
                        // activity when binding to the service. That way you have a direct
                        // "connection" with the message queue of the thread instead of
                        // a message queue in the service itself (main thread of service)
            mServiceThreadHandler = mService.getServiceHandler();
    
            if (mServiceThreadHandler == null) {
                Log.e(TAG, "Service handler is NULL");
            }
            mBoundedToService = true;
        }
    
        @Override
        public void onServiceDisconnected(ComponentName name) {
            mServiceThreadHandler = null;
            mBoundedToService = false;
        }
    }
    

    服务代码:

    private HandlerThread mServiceThread = new MyServiceThread();
    
    public Handler getServiceHandler() {
        return new Handler(mServiceThread.getLooper());
    }
    

    new Handler(mServiceThread.getLooper()); 是否在mServiceThread中返回一个新的Handler或同一个Handler?

    编辑2:使用接收邮件的serviceThread更新服务代码。

    public class MyService extends Service {
      private MyHandlerThread serviceThread = new MyHandlerThread("serviceThread");
    
      serviceThread.start();
    
    public Handler getServiceHandler() {
      // hand out the same handler of the service thread for using it in an activity!
      // serviceThread.getLooper() is the current looper of the thread
      // serviceThread is the 'this' which handles the messages (see MyHandlerThread)
      return new Handler(serviceThread.getLooper(), serviceThread); 
    }
    
      // do stuff in Service
    }
    
    public class MyHandlerThread extends HandlerThread implements android.os.Handler.Callback {
    public MyHandlerThread(String name) {
        super(name);
    }
    public MyHandlerThread(String name, int priority) {
        super(name, priority);
    }
    @Override
    public boolean handleMessage(Message msg) {
        // TODO define your own message handling here.
        return false;
    }
    }
    

    正确?

1 个答案:

答案 0 :(得分:1)

试试这个(我使用Activity来测试它你将使用Service):

protected void onCreate(Bundle savedInstanceState) {
    ht = new HandlerThread("HT");
    ht.start();
    htHandler = new Handler(ht.getLooper(), htCallback);
    mainHandler = new Handler(mainCallback);
    for (int i = 0; i < 10; i++) {
        htHandler.sendMessageDelayed(htHandler.obtainMessage(99, i, 0), i * 3000);
    }
}

private HandlerThread ht;
private Handler htHandler;
private Handler mainHandler;

private Callback htCallback = new Callback() {
    @Override
    public boolean handleMessage(Message msg) {
        Log.d(TAG, "handleMessage **********************");
        Log.d(TAG, "handleMessage " + msg);
        Log.d(TAG, "handleMessage Thread: " + Thread.currentThread());
        if (msg.arg1 == 4) {
            Log.d(TAG, "handleMessage sending back to Main thread");
            mainHandler.sendEmptyMessage(101);
        }
        return false;
    }
}; 

private Callback mainCallback = new Callback() {
    @Override
    public boolean handleMessage(Message msg) {
        Log.d(TAG, "handleMessage ########################");
        Log.d(TAG, "handleMessage " + msg);
        Log.d(TAG, "handleMessage Thread: " + Thread.currentThread());
        Log.d(TAG, "handleMessage i'm quitting");
        ht.quit();
        return false;
    }
};