繁体   English   中英

如何安全地停止从Alertdialog启动的线程?

[英]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 ,则有两种可能性:

  1. 你是专家,你知道自己在做什么
  2. 你是绿色的,你做错了

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM