0

我确信我的问题的解决方案将是那些“duh”时刻之一,但我被困住了,所以任何有用的提示都会被感激地收到。

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

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 循环中并且消息处理程序没有得到查看。

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

干杯安迪

4

1 回答 1

2

改变:

  while (boolLoop = true){
            stuff.do
        }

至:

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

或者最好

  while (booloop){
          stuff.do
        }

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

还有一件事是你不需要一个活套对象。只需使用 while 循环来控制它。我会这样做:

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

于 2013-04-09T22:00:37.037 回答