我正在运行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中显示警告它正在泄漏上下文。
有什么办法可以避免这种情况?
答案 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...
}