中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2021-11-26 11:20:23 來源:億速云 閱讀:156 作者:柒染 欄目:開發技術

這篇文章將為大家詳細講解有關如何在退出一個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);

        }

    }

關于如何在退出一個activity后很好的取消AsyncTask繼續運行就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

肃北| 霍邱县| 台州市| 塔河县| 乌拉特前旗| 东乡| 临朐县| 成安县| 达州市| 潜山县| 榆社县| 茌平县| 谢通门县| 富裕县| 富顺县| 锡林浩特市| 武汉市| 横山县| 肃北| 石首市| 古丈县| 黄梅县| 龙州县| 盐亭县| 那曲县| 兴业县| 西平县| 图们市| 南平市| 涞源县| 乌恰县| 大渡口区| 汝州市| 晋中市| 岐山县| 韶山市| 岢岚县| 汉源县| 江山市| 惠来县| 吴江市|