我在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。

最佳答案

考虑在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。

关于android - 使用AsyncTask作为内部类的内存泄漏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24679383/

10-10 06:32