如何在退出一個activity後,很好的取消AsyncTask繼續運行?

問題

當進入一個詳細頁面,這時程序會彈出一個對話框加載網絡數據,可是發現用戶經常因爲數據加載慢,就快速的退出這個頁面,這樣反覆來回幾次後,發現AsyncTask不再繼續加載,而是慢慢的等待,查了下個數,是前幾個沒有及時的關閉,導致當前的異步任務一直在等待。

所以想請教如何在退出一個頁面後,也同時關閉對應的異步任務?

初步解決代碼方案:

public class Task extends AsyncTask<Void, Void, Void>{
@Override
protected Void doInBackground(Void... path) {
// Task被取消了,馬上退出循環
if(isCancelled()) return null;
}

@Override
public void onProgressUpdate(File... files) {
// Task被取消了,不再繼續執行後面的代碼

if(isCancelled()) return;
.........
}
}

UI線程:

// 保持對Task的引用

private PhotoTask task;

// 1,啓動新的任務
task = new PhotoTask();
task.execute(path);

// 2, 取消任務

if (task != null && task.getStatus() == AsyncTask.Status.RUNNING) {
task.cancel(true); // 如果Task還在運行,則先取消它
}

}

}

解決方案的理論與解釋

  1. 設置Activity SingleTask 防止在開啓一個Activity的時候 新建一個對象

    1. 在Activity 銷燬的時候 使用AsyncTask . 取消的那個方法

    2. 自己寫一個AsynvTask

  2. 網友評論:加載網絡數據、訪問數據庫、文件等這些問題,應該另起一個線程並且後臺運行,不用讓用戶等待你的數據加載。
    回到你的問題上來,AsyncTask用的是線程池,線程不用就會放回池中. 有新的AsyncTask會取出已有線程,之後開始執行,這就是導致你有多個AsyncTask的原因。所以即使調用AsyncTask的cancle方法,你會發現依舊結束不了這個東西。
    你嘗試在關閉界面的同時獲得當前界面綁定的那個AsyncTask對象,並將其設置爲空。如果依舊不行,那就可以考慮自己封裝一個下載線程啦

最後調試後的代碼

public class LoadPage extends AsyncTask<Void, Void, Void> {


        private volatile boolean running = true;

        private final ProgressDialog progressDialog;


        public LoadPage(Context ctx) {

            progressDialog = new ProgressDialog(ctx);


            progressDialog.setCancelable(true);

            progressDialog.setOnCancelListener(new OnCancelListener() {

                @Override

                public void onCancel(DialogInterface dialog) {

                    running = false;

                }

            });


        }


        @Override

        protected void onPreExecute() {

            progressDialog.show();

        }


        @Override

        protected void onCancelled() {

            running = false;

        }

       

        @Override

        protected Void doInBackground(Void... params) {


            while(running){

                // does the hard work one,two,three,

                Log.e("tag","run..");

            }

            Log.e("tag","exit");

            return null;

        }


        // ...

        @Override

        protected void onPostExecute(Void result) {

            super.onPostExecute(result);

            

        }

    }

總結:

經過上面的分析以及網友給出的具體建議,已經將問題解決了,在此,思考問題的同時,還不能忘了如何更好的從理論出發

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章