安卓 'leaking context' 错误

标签 android android-asynctask android-context

我正在运行 AsyncTask 以通过 HTTP 检索一些信息。

我从我的主要 Activity 中调用此方法(do_get_from_url() 由单击按钮触发):

private void do_get_from_url() {
    new getFromURL(this).execute();
}

这个调用的类在同一个.java文件中,开始如下:

class getFromURL extends AsyncTask<Void, Void, String> {

  private MainActivity activity;

  getFromURL(MainActivity activity){
    this.activity = activity;
  }

  ...other code here...

  String linkURL = activity.link_url.getText().toString();

  String getFromURLrequestURL = activity.getString(R.string.short_url_request_url_base);

  ...other code here...

}

看来我需要使用 activity 才能从主要 Activity 访问字符串资源和 UI 元素 link_url 但行 this. activity = activity 在 Android Studio 中显示它正在泄漏上下文的警告。

有什么办法可以避免这种情况吗?

最佳答案

根本原因:您将 Activity 作为上下文传递给后台线程。所以线程将保留对 Activity 的引用。只要线程在运行,Activity 就不会被销毁(通过调用 finish() 方法或用户按返回键结束 Activity)。 泄漏 一词仅表示不再使用对象或实例,但系统无法回收它们所在的内存。

解决方案:在 Android 中,您可以使用一个名为 WeakReference 的 API,它会保持对您的对象(在本例中为您的 Activity)的引用, 所以当 Activity 被销毁时,它不会再保留引用。

getFromURL.java

class getFromURL extends AsyncTask<Void, Void, String> {

    private WeakReference<MainActivity> mainActivityWeakReference;

    getFromURL(MainActivity activity){
        mainActivityWeakReference = new WeakReference<>(activity);
    }

  ...other code here...

    MainActivity activity = mainActivityWeakReference.get();
    // Always check this to make sure the activity haven't got destroyed yet.
    if (activity != null) {
        String linkURL = activity.link_url.getText().toString();
        String getFromURLrequestURL = activity.getString(R.string.short_url_request_url_base);
    }

  ...other code here...

}

关于安卓 'leaking context' 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51947931/

相关文章:

android - 如何在android中使用kSoap2在AsyncTask中返回soapObjet

java - Activity 的实例变量未在 AsyncTask 的 onPostExecute 中设置或如何将数据从 AsyncTask 返回到主 UI 线程

android - 如何在android中选择的上下文项目中获得位置?

android - Android Lollipop 中的 insmod 强制执行 SE Linux

android - 如何清除 RecyclerView 适配器数据

java - Android:下载的图像未显示在 ListView 中

android - 模仿 Android API 级别 8 之前的 Context.getExternalFilesDir()?

Android: fragment 中的 getContext() 仅在离开后退按钮时返回 null

java - 创建覆盖 Activity

Android Studio 状态栏着色不起作用