警告:此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類更長壽。這是因為對包含類的隱式引用。這將防止活動被垃圾收集,從而導致內存泄漏。
要解決您的問題,請使用靜態嵌套類而不是匿名,本地和內部類,或使用頂級類。
斯蒂芬大帝
TA貢獻1827條經驗 獲得超8個贊
此類AsyncTask應該是靜態的,否則可能會發生泄漏
什么時候
Activity被摧毀,AsyncTask(兩個static或non-static)仍在運行如果內部類是
non-static(AsyncTask)類,它將引用外部類(Activity)。如果一個對象沒有引用指向它,
Garbage Collected將釋放它。如果一個對象未使用且Garbage Collected無法釋放它=>泄漏內存
=>如果AsyncTask是non-static,Activity將不會釋放它被銷毀的事件=>泄漏
將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);
}
}}- 3 回答
- 0 關注
- 1136 瀏覽
添加回答
舉報
0/150
提交
取消
