gpt4 book ai didi

java - 如何安全地停止从警报对话框启动的线程?

转载 作者:行者123 更新时间:2023-12-01 11:55:14 24 4
gpt4 key购买 nike

当我显示警报对话框时,我启动一个线程,开始 30 秒倒计时,以更新此警报对话框中显示的确定进度条。

我将可运行对象创建为静态内部类,这样我就不会泄漏上下文( Activity ),但是当然我无法访问标志来停止线程,也无法访问我想要更新的 View 。我该如何解决这个问题?

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 与工作线程和消息总线来与 fragment 或 Activity 进行通信。有很多用于异步编程的库。我可以推荐这个:

https://github.com/stephanenicolas/robospice

它的主要用途是网络,但您也可以将其用于其他用途。

第三个解决方案是Loader API:

http://developer.android.com/reference/android/content/Loader.html

它的目的是从数据库异步加载数据(SQLite 很慢),但是很容易将它用于其他事情,例如数据处理。

请记住:如果您使用Thread,则有两种可能性:

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

关于java - 如何安全地停止从警报对话框启动的线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28509296/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com