簡體   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