3

嗨,伙计,我有一个带有此代码的线程

private final class Consumer extends Thread {

    public boolean running;

    public Handler consumerHandler;

    public void run() {
        Looper.prepare();
        consumerHandler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                Log.i(LOG_TAG, "Consumer-> " + msg.obj);
            }
        };
        Looper.loop();

    }

}

我的活动创建了一个 Consumer 类型的线程 T 并在其上调用 start。活动如何停止线程 T ?

4

3 回答 3

2

除非抛出异常或您调用了该方法,否则运行消息循环通常不会退出循环。quit()看看 DOC -一定要调用 quit() 来结束循环

    @Override
    protected void onDestroy() {
      consumerObj.consumerHandler.quit(); 
      super.onDestroy();
    }
于 2012-09-05T12:37:25.480 回答
1

上面的一条评论说 Looper 不检查isInterrupted(). 我试图通过调用Thread.interrupt()并将其添加到循环中来说服我的:

        if (isInterrupted()) {
            socket.close();
            Looper.myLooper().quit();
        } else {
            Looper.loop();
        } 
        //some exit code.

我还调用了 myHandler.sendEmptyMessage(0) 来执行一个循环并捕获interrupt,但没有运行退出代码的迹象。在调试时,消息甚至没有到达队列;
我不确定是否兴奋。

于 2015-12-27T18:51:32.330 回答
0

试试这个

if(Consumer != null) {
   Thread thread = Consumer;
   Consumer = null;
   thread.interrupt();
}

或者里面有条件

public void run() {
   while(running) {

   }
}

停止线程集running = false;

参考这里

于 2012-09-05T12:26:11.503 回答