通过将activity对象传递给AsyncTask的构造函数。有可能吗? 活动泄漏。若然后如何发生,任何人都可以解释一下。如果发生这种情况,如何避免活动泄露。
public class RemoteLoader extends AsyncTask<Void, Void, Void> {
private Activity activity;
public RemoteLoader(Activity context){
this.activity = context;
}
@Override
protected Void doInBackground(Void... Pages) {
// do in bg
}
@Override
protected void onPostExecute(Void result) {
// Set title into TextView
TextView txttitle = (TextView)activity.findViewById(R.id.txtProtip);
txttitle.setText(protip);
}
}
答案 0 :(得分:2)
AsyncTask
保留对Activity
的引用,因此当Activity
为garbage collected
时,AsyncTask
实例不能为alive/running
。< / p>
在某些情况下,例如方向更改,不再需要“旧” Activity
实例,因为框架会创建另一个Activity
实例。在这种情况下,如果您的AsyncTask
将强引用保留到Activity
实例,则会出现内存泄漏。
要避免此问题,请按以下方式使用WeakReference
:
public class RemoteLoader extends AsyncTask<Void, Void, Void>{
private WeakReference<Activity> activity;
public RemoteLoader(Activity context){
this.activity = new WeakReference<Activity>(context);
}
...
...
}
使用WeakReference
时,您可以确保Activity
实例在需要时可以进行垃圾回收。您可以详细了解WeakReference
here。
答案 1 :(得分:1)
尝试在AsyncTask中对您的Activity进行WeakReference。完成后,检查活动是否仍然存在。