Android“泄漏上下文”错误

时间:2018-08-21 11:42:48

标签: android android-asynctask android-context

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

我从我的主要活动中调用此方法(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才能从主要活动中访问字符串资源和UI元素link_url,但是行this.activity = activity在Android Studio中显示警告它正在泄漏上下文。

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

2 个答案:

答案 0 :(得分:1)

是的,有。正确的方法是使用这样的WeakRefrence

WeakReference<MainActivity> parent;

GetFromURL(MainActivity activity){
   parent = new WeakReference(activity);
}

...other code here...

String linkURL = parent.get().link_url.getText().toString();

String getFromURLrequestURL = parent.get().getString(R.string.short_url_request_url_base);

...此处的其他代码...

答案 1 :(得分:1)

根本原因::您正在将活动作为上下文传递给后台线程。因此,线程将保留对活动的引用。只要线程正在运行,就无法破坏活动(通过调用finish()方法或用户按返回键来完成活动)。术语泄漏仅表示不再使用对象或实例,但系统无法回收它们所处的内存。

解决方案::在Android中,您可以使用名为WeakReference的API,它只会对您的对象(在这种情况下为您的活动)保持引用,因此活动被销毁,它将不再保留引用。

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...

}