我正在运行 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/