此代码中的活动泄漏如何发生

时间:2013-12-27 09:38:07

标签: android android-activity android-asynctask

通过将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);
    }

}

2 个答案:

答案 0 :(得分:2)

AsyncTask保留对Activity的引用,因此当Activitygarbage 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。完成后,检查活动是否仍然存在。