您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關如何在退出一個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還在運行,則先取消它
}
}
}
解決方案的理論與解釋
設置Activity SingleTask 防止在開啟一個Activity的時候 新建一個對象
在Activity 銷毀的時候 使用AsyncTask . 取消的那個方法
自己寫一個AsynvTask
網友評論:加載網絡數據、訪問數據庫、文件等這些問題,應該另起一個線程并且后臺運行,不用讓用戶等待你的數據加載。
回到你的問題上來,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);
}
}
關于如何在退出一個activity后很好的取消AsyncTask繼續運行就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。