无法使用sleep-Timer和TimerTask在Android中停止Thread

时间:2013-01-27 23:07:39

标签: android multithreading networking

我希望在一个while循环中从网络获取一些数据,直到用户点击屏幕上的按钮,然后停止接收数据并显示另一个活动。我收到的内容如下:

Thread listUpdater;

...

listUpdater = new Thread() {
    @Override
    public void run() {
        TimerTask task = new UpdateListTask();

        while (true) {
            task.run();
        }
    }
};
listUpdater.start();

...

public class UpdateListTask extends TimerTask {

     public UpdateListTask() {
     }

     @Override
     public void run() { 
        // get some data from network (asynchronically)
     }
}

用户点击按钮后,运行以下代码:

try {
    listUpdater.join();
} catch (InterruptedException e) {
    e.printStackTrace();
}

但它并没有停止新线程/计时器任务中的运行循环,所有代码仍在运行 - 我不想要的。我该怎么做才能阻止代码运行?有没有办法阻止线程?或者我可以做一些线程间布尔变量设置来停止while循环吗?

我尝试了一切,但没有成功。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

.join等待线程完成。你的线程永远不会完成,所以一切都会破裂。

实际停止线程的一种简单方法是:

volatile boolean updateList;
Thread listUpdater;

...

listUpdater = new Thread() {
    @Override
    public void run() {
        TimerTask task = new UpdateListTask();

        while (updateList) {
            task.run();
        }
    }
};
updateList = true;
listUpdater.start();

try {
    updateList = false;
    listUpdater.join();
} catch (InterruptedException e) {
    e.printStackTrace();
}

这样,您可以使用布尔变量作为标志来控制listUpdater线程的执行。每次要重新启动线程时,请记得将其设置为true。