我在我的 Activity 中使用一个名为 GetSalesTask 的 AsyncTask 作为内部类,但它似乎正在泄漏,我可以从同一个 GetSalesTask 类中看到很多实例,换句话说,GetSalesTask 的实例似乎是还活着,并没有从内存中清除。 您能指出我的问题出在哪里吗?
class LeekClass extends BaseProfileActivity{
void callTask()
{
new GetSaleTask().execute();
}
private class GetSalesTask extends AsyncTask<Void, Void, Boolean> {
@Override
protected void onPreExecute() {
showList(true);
super.onPreExecute();
}
@Override
protected Boolean doInBackground(Void... params) {
List<Sale> saleList = get Data From Database
mItems.clear();
mItems.addAll(saleList);
if (saleList.size() > 0)
return true;
else
return false;
return false;
}
@Override
protected void onPostExecute(Boolean result) {
BaseProfileActivity baseAct = (BaseProfileActivity) getActivity();
if (baseAct != null && getView() != null && mAdapter != null) {
mAdapter.notifyDataSetChanged();
showList(true);
baseAct.getProgress().setVisibility(View.GONE);
}
}
}
}
方法 showList(true);获取 View ();并且变量 mItems、mAdapter 在 Activity 中定义。
最佳答案
考虑在 onPostExecute 中将任务设置为 null,并在开始任务之前检查是否为 null。理论上,GC 应该追溯到 null 并确定一切都可以清理。
if (myTask==null) {
myTask = new getSaleTask();
myTask.execute();
}
某处 onPostExecute();
myTask =null;
我已经切换到执行上述操作并传递 WeakReference<T>
将 WeakReference 传递给类。这对我来说在构造函数中更容易做到。下面我传递一个WeakReference<Context>
到类(class)。将 weakReference 保存在类的构造函数中。
new getSaleTask(new WeakReference<Context>(getApplicationContext());
public getSaleTask(WeakReference<Context> weakReference){
this.weakReference = weakReference;
}
然后在类中你得到如下的 WeakReference。
Context context = weakReference.get();
无论出于何种原因,当任务完成时将 weakReference 设置为 null。
关于android - 使用 AsyncTask 作为内部类的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24679383/