【问题标题】:Can't stop Thread in Android with sleep-Timer and TimerTask无法使用 sleep-Timer 和 TimerTask 在 Android 中停止线程
【发布时间】:2013-01-27 23:07:38
【问题描述】:

我想在 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循环吗?

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

【问题讨论】:

    标签: android multithreading networking


    【解决方案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。

    【讨论】:

    • 谢谢哥们,不知道为什么,但这次它完美! :)
    猜你喜欢
    • 2011-09-22
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 2013-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多