android - 使用 AsyncTask 作为内部类的内存泄漏

标签 android android-asynctask android-memory

我在我的 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/

相关文章:

android - 以编程方式设置 imageView 宽度时的空指针

android - 如何使用 Material 设计的显示效果在 Android 上显示对话框?

android - 如何在 AOSP 项目中使用我预构建的 C++ 静态/共享库

php - 在 AsyncTask 中执行 doInBackground() 时出错

android - Android 中 JNI 的内存限制是什么?

android - GC_FOR_ALLOC 与 GC_FOR_MALLOC 不同吗?

java - 如何显示ImageButton被按下?

android - 如何在屏幕旋转期间处理 AsyncTask?

java - 在android中获取json时控制空值

java - 如何使用 Eclipse 内存分析器工具 (MAT) 分析 HashMap