【问题标题】:Interrupt a thread while loop using message from UI使用来自 UI 的消息在循环时中断线程
【发布时间】:2013-04-10 06:07:07
【问题描述】:

我确信我的问题的解决方案将是那些“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 循环?

干杯 安迪

【问题讨论】:

    标签: android multithreading messaging looper


    【解决方案1】:

    变化:

      while (boolLoop = true){
                stuff.do
            }
    

    到:

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

    或者最好

      while (booloop){
              stuff.do
            }
    

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

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

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

    【讨论】:

    • 这是一个很好的建议,但我不确定它是否能胜任。我认为 OP 的真正问题是 handleMessage 永远不会从 START 消息中返回,因此 looper 永远不会处理下一条消息。
    • 感谢你们超级快速的反应。
    • JoxTraex, = vs == 只是我的代码缩写时的拼写错误。我试图避免使用全局变量来提供 UI/线程控制并改用消息传递。但是,这让我陷入了我目前的兔子洞。也许循环器不是必需的,因为我真的不需要排队很多消息,但我仍然需要一种方法来根据来自 UI 的消息中断 while 循环。
    • 它不是一个真正的兔子洞,但从你接近它的方式来看它是一个兔子洞。我的方法解决了这个问题,绕过一个全局变量是不可能的。或者另一种方法是使用 Activity 和 Service 方法并让 Activity 通过绑定控制该服务。他们可以直接相互传递消息。
    • Ted Hope,是的,这就是问题所在。我想继续 stuff.do(ing) 直到从 UI 发出停止请求。然后Finish.do,最后退出子doWhileLoop()。线程卡在 while 循环中,从不处理传入的消息。你能想出一种不同的方式来达到我的目的吗?塔。
    猜你喜欢
    • 2016-11-18
    • 2013-01-07
    • 2013-01-28
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    • 2012-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多