有没有任何方法可以在使用java的android中使用AsyncTask而不发生内存泄漏



我想知道有没有任何方法可以在不泄漏任何内存的情况下使用异步任务。尝试使用接口,通过构造函数将异步任务设置为静态等,所有这些都会导致上下文泄漏。

使用上下文的弱引用。

static class MyAsyncTask extends AsyncTask<Void,Void,Void>{
private WeakReference<Context> contextWeakReference;
public MyAsyncTask(Context context){
this.contextWeakReference=new WeakReference<>(context);
}
@Override
protected Void doInBackground(Void... voids) {
Context context=contextWeakReference.get();
if (context!=null){
//Do your stuff
}
return null;
}
}

阅读有关WeakRefence 的更多信息

我建议使用Executor异步执行相关代码,例如:

public static final Executor oneThreadExecutor = Executors.newSingleThreadExecutor();
public static final Executor threadPoolExecutor = Executors.newFixedThreadPool(nThreads);
public LiveData<Object> getStuffData(Executor executor){
final MutableLiveData<Object> stuffData = new MutableLiveData<>();
executor.execute(new Runnable() {
@Override
public void run() {
// Should replace AsyncTask.doInBackground
// do your async stuff here and post it to 'stuffData'
stuffData.postValue(new Object());
}
});
return stuffData;
}
// should called from LifeCycleOwner
public void observeStuffData(){
getStuffData(threadPoolExecutor).observe(/*Activity/ Fragment view life cycle owner*/, new Observer<Object>() {
@Override
public void onChanged(Object o) {
// Should replace AsyncTask.onPostExecute
}
});
}

最新更新