亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

警告:此AsyncTask類應該是靜態的,否則可能會發生泄漏

警告:此AsyncTask類應該是靜態的,否則可能會發生泄漏

楊__羊羊 2019-08-14 17:37:01
警告:此AsyncTask類應該是靜態的,否則可能會發生泄漏我在我的代碼中收到警告:這個AsyncTask類應該是靜態的,否則可能會發生泄漏(匿名android.os.AsyncTask)完整的警告是:此AsyncTask類應該是靜態的,否則可能會發生泄漏(匿名android.os.AsyncTask)靜態字段將泄漏上下文。非靜態內部類具有對其外部類的隱式引用。如果該外部類例如是片段或活動,則此引用意味著長時間運行的處理程序/加載器/任務將保留對活動的引用,從而阻止其收集垃圾。同樣,對來自這些較長時間運行的實例的活動和片段的直接字段引用可能會導致泄漏。ViewModel類絕不應指向視圖或非應用程序上下文。這是我的代碼: new AsyncTask<Void,Void,Void>(){         @Override         protected Void doInBackground(Void... params) {             runOnUiThread(new Runnable() {                 @Override                 public void run() {                     mAdapter.notifyDataSetChanged();                 }             });             return null;         }     }.execute();我該如何糾正?
查看完整描述

3 回答

?
米琪卡哇伊

TA貢獻1998條經驗 獲得超6個贊

非靜態內部類包含對包含類的引用。當您聲明AsyncTask為內部類時,它可能比包含Activity類更長壽。這是因為對包含類的隱式引用。這將防止活動被垃圾收集,從而導致內存泄漏。

要解決您的問題,請使用靜態嵌套類而不是匿名,本地和內部類,或使用頂級類。


查看完整回答
反對 回復 2019-08-14
?
斯蒂芬大帝

TA貢獻1827條經驗 獲得超8個贊

此類AsyncTask應該是靜態的,否則可能會發生泄漏

  • 什么時候Activity被摧毀,AsyncTask(兩個staticnon-static)仍在運行

  • 如果內部類是non-staticAsyncTask)類,它將引用外部類(Activity)。

  • 如果一個對象沒有引用指向它,Garbage Collected將釋放它。如果一個對象未使用且Garbage Collected 無法釋放它=>泄漏內存

=>如果AsyncTasknon-staticActivity將不會釋放它被銷毀的事件=>泄漏

將AsyncTask作為靜態類而不泄漏后的更新UI解決方案

1)使用WeakReference@Suragch回答
2)發送和刪除Activity對(from)的引用AsyncTask

public class NoLeakAsyncTaskActivity extends AppCompatActivity {
    private ExampleAsyncTask asyncTask;

    @Override 
    protected void onCreate(Bundle savedInstanceState) {
        ...

        // START AsyncTask
        asyncTask = new ExampleAsyncTask();
        asyncTask.setListener(new ExampleAsyncTask.ExampleAsyncTaskListener() {
            @Override
            public void onExampleAsyncTaskFinished(Integer value) {
                // update UI in Activity here
            }
        });
        asyncTask.execute();
    }

    @Override
    protected void onDestroy() {
        asyncTask.setListener(null); // PREVENT LEAK AFTER ACTIVITY DESTROYED
        super.onDestroy();
    }

    static class ExampleAsyncTask extends AsyncTask<Void, Void, Integer> {
        private ExampleAsyncTaskListener listener;

        @Override
        protected Integer doInBackground(Void... voids) {
            ...
            return null;
        }

        @Override
        protected void onPostExecute(Integer value) {
            super.onPostExecute(value);
            if (listener != null) {
                listener.onExampleAsyncTaskFinished(value);
            }
        }

        public void setListener(ExampleAsyncTaskListener listener) {
            this.listener = listener;
        }

        public interface ExampleAsyncTaskListener {
            void onExampleAsyncTaskFinished(Integer value);
        }
    }}


查看完整回答
反對 回復 2019-08-14
  • 3 回答
  • 0 關注
  • 1136 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號