[英]How to safely stop a thread launched from an alertdialog?
当我显示警报对话框时,我启动一个线程,该线程开始30秒的倒计时,以更新此警报对话框中显示的确定进度条。
我将可运行对象创建为静态内部类,这样就不会泄漏context(activity),但是当然我不能访问标志来停止线程,也无法访问想要更新的视图。 我该如何解决?
public class MyDialogFragment implements DialogInterface.onShowListener, DialogInterface.onDismissListener {
private boolean stopThread = false;
private Progressbar countdownBar;
private TextView countdownRatio;
@Override public void onShow() {
Thread progressThread = new Thread(new myRunnable());
progressThread.start();
}
@Override public void onDismiss() {
stopThread = true;
this.dismiss();
}
private static class myRunnable implements Runnable {
int progressStatus = 0;
int numSeconds = 30;
@Override public void run() {
while (!threadStop && progressStatus < numSeconds) {
progressStatus++;
handler.post(new Runnable() {
public void run() {
countdownBar.setProgress(progressStatus);
countdownRatio.setText(progressStatus + "/" + numSeconds + " secs");
}
});
try {
// update the counter every sec
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
首先-不要使用Thread
您正在寻求麻烦,尤其是您似乎对多线程编程不满意。 这是一个棘手的话题,有很多陷阱。 绝对不是菜鸟。
您可以为此使用AsyncTask
它通过AsyncTask.onProgressUpdate()
与UI事件循环具有很好的集成。 AsyncTask
使用内部线程池。
http://developer.android.com/guide/components/processes-and-threads.html#Threads
对于大多数琐碎的事情, AsyncTask
都可以。 对于更高级的使用,请尝试将Service
与辅助线程和消息总线一起使用以与片段或活动进行通信。 有很多用于异步编程的库。 我可以推荐这个:
https://github.com/stephanenicolas/robospice
这是联网的主要目的,但您也可以将其用于其他用途。
第三种解决方案是Loader
API:
http://developer.android.com/reference/android/content/Loader.html
它用于从数据库异步加载数据(SQLite速度很慢),但是将其用于其他内容(例如数据处理)非常容易。
请记住:如果使用Thread
,则有两种可能性:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.