[英]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.