使用来自UI的消息在循环中断线程

时间:2013-04-09 21:57:51

标签: android multithreading messaging looper

我确定我的问题的解决方案将是其中之一" duh"时刻,但我被卡住了,所以任何有用的提示都会被感激地收到。

问题:我有一个带后台线程的UI。 UI有一个启动/停止按钮,用于启动并停止线程中的进程。这是通过使用消息从UI到包含在looper中的线程中的消息处理程序来实现的。线程进程在一个while循环中,依赖于线程消息处理程序的布尔值设置为true / false。但是,一旦启动,就不会再处理其他消息,并且循环会无限期地继续。

private class MyThread extends Thread{
    public void run() {
      Looper.prepare();
          MyThreadChildHandler = new Handler() {
              public void handleMessage(Message msg) {
                  switch(msg.arg1) {
                 case START:
                          boolLoop = true;
                          doWhileLoop();
                     case STOP:
                          boolLoop = false;
                     }
          };
      Looper.loop();
    }

    private void doWhileLoop(){
        while (boolLoop = true){
            stuff.do
        }
        finish.do
    }

}

我从UI上获取了一条关于STOP消息的logcat消息并且该消息已被触发,但该线程从未接收它,因为它卡在while循环中并且消息处理程序没有& #39; t了解一下。

有没有办法让线程处理程序在各个点检查while循环内的消息?或者是否有其他方法可以根据来自UI的消息获得基于线程的连续while循环来启动和停止?

干杯 安迪

1 个答案:

答案 0 :(得分:2)

变化:

  while (boolLoop = true){
            stuff.do
        }

为:

  while (boolLoop == true){
            stuff.do
        }

或者最好

  while (booloop){
          stuff.do
        }

您需要检查是否相等(==)而不是分配(=)。

另外一件事是你不需要一个looper对象。只需使用while循环控制它。我会这样做:

我会让线程无限期地执行它的进程,直到它超时或来自控制该线程的处理程序的消息通过在两个类(如Activity和Thread)之间共享的标志变量来停止该线程的执行。活动的状态控制线程的位置。例如,假设应用程序进入后台,那就是当你将running flag设置为false时,它就会停止。您的Looper执行不是必需的。消息传递的方式也是通过处理程序。