【问题标题】:Worker Thread to Worker Thread Communication工作线程到工作线程通信
【发布时间】:2018-08-29 18:29:57
【问题描述】:

Java/Android -

我找不到任何工作线程到工作线程的通信示例。示例总是涉及 UiThread。

我有一个 HandlerThread 接收工作,而 HandlerThread 将工作分散到多个工作线程上。我希望多个工作线程与 HandlerThread 进行通信。

我所能做的就是让工作线程通过处理程序与 UiThread 通信。谢谢!

【问题讨论】:

  • 我想我不会。我见过的例子将 UiHandler 传递给 HandlerThread。我也想这样做,因为我希望 HandlerThread 与 UiThread 进行通信。

标签: java android multithreading ipc handler


【解决方案1】:
public class ModelFragment extends Fragment implements Handler.Callback {

   Handler backHandler1, backHandler2, mainHandler;

   @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);

        HandlerThread backThread1 = new HandlerThread("BACK_THREAD_1");
        backThread1.start();
        backHandler1 = new Handler(backThread1.getLooper(), this);

        HandlerThread backThread2 = new HandlerThread("BACK_THREAD_2");
        backThread2.start();
        backHandler2 = new Handler(backThread2.getLooper(), this);

        mainHandler = new Handler(Looper.getMainLooper(), this);
        // sending message from main thread to thread 1
        backHandler1.obtainMessage(BACK1_WHAT, backObj).sendToTarget();
    }

    @Override
    public boolean handleMessage(Message msg) {
        switch(msg.what){
            case BACK1_WHAT:
            // this code runs on thread 1

            // sending message to thread 2 from thread 1
            backHandler2.obtainMessage(BACK2_WHAT, backObj1).sendToTarget();
            return true;

            case BACK2_WHAT:
            // this code runs on thread 2

            // sending message to thread 1 from thread 2
            backHandler1.obtainMessage(BACK1_WHAT, backObj2).sendToTarget();

            // sending message to main thread from thread 2
            mainHandler.obtainMessage(MAIN_WHAT, backObj2).sendToTarget();
            return true;

            case MAIN_WHAT:
            // runs on ui thread
            return true;
        }
        return false;
    }

    @Override
    public void onDestroy() {
       if(null != backHandler1) {
           backHandler1.removeCallbacksAndMessages(null);
           if(null != backHandler1.getLooper())
               backHandler1.getLooper().quit();
       }
       if(null != backHandler2) {
           backHandler2.removeCallbacksAndMessages(null);
           if(null != backHandler2.getLooper())
               backHandler2.getLooper().quit();
       }
       super.onDestroy();
   }
}

【讨论】:

  • 这很有趣。那么“handleMessage”虽然在 Fragment 中定义,但不会在 UiThread 上运行?
  • 不在这里,每个案例都基于消息的“WHAT”在不同的线程上。通常在程序语言中,即使一行也可以在不同的线程上运行。
  • this 在代码backHandler2 = new Handler(backThread2.getLooper(), this); 中用于回调,这意味着对象处理backHandler2 的回调
  • 好的,谢谢。我从来没有想到过。这实际上很有帮助。
猜你喜欢
  • 1970-01-01
  • 2013-10-09
  • 1970-01-01
  • 2013-07-21
  • 1970-01-01
  • 1970-01-01
  • 2020-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多