我在我的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); getView();并且变量mItems,mAdapter在活动中定义。
答案 0 :(得分:1)
考虑在onPostExecute中将任务设置为null并在启动任务之前检查null。 GC理论上应该追溯到null并确定一切都可以清理。
if (myTask==null) {
myTask = new getSaleTask();
myTask.execute();
}
onPostExecute();
myTask =null;
我已经转而执行上述操作并将WeakReference<T>
传递给WeakReference。这对我来说更容易在构造函数中完成。下面我将WeakReference<Context>
传递给班级。将weakReference保存在类的构造函数中。
new getSaleTask(new WeakReference<Context>(getApplicationContext());
public getSaleTask(WeakReference<Context> weakReference){
this.weakReference = weakReference;
}
然后在课堂上你得到WeakReference如下。
Context context = weakReference.get();
无论出于何种原因,在任务完成时将weakReference设置为null。