避免AsyncTask内存泄漏

原创
2016/12/14 12:14
阅读数 1.1K

避免AsyncTask内存泄漏的简单例子:

Activity代码:

public class MainActivity extends Activity {
  private MyAsyncTask task;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    task = new MyAsyncTask();
    task.setListener(createListener());
    task.execute();
  }
  @Override
  protected void onDestroy() {
    task.setListener(null);
    super.onDestroy();
  }
  private MyAsyncTask.Listener createListener() {
    return new MyAsyncTask.Listener() {
      @Override
      public void onSuccess(Object object) {
        // adapt contents
      }
    };
  }
}


这里是AsyncTask:

class MyAsyncTask extends AsyncTask {
  private Listener listener;
  @Override
  protected Object doInBackground(Object[] params) {
    return doSomeStuff();
  }
  private Object doSomeStuff() {
    //do something to get result
    return new Object();
  }
  @Override
  protected void onPostExecute(Object object) {
    if (listener != null) {
      listener.onSuccess(object);
    }
  }
  public void setListener(Listener listener) {
    this.listener = listener;
  }
  interface Listener {
    void onSuccess(Object object);
  }
}

整体思路:

    通过注册接口回调的方式,处理AsyncTask返回的数据。

 

novoda/bonfire-firebase-sample
bonfire-firebase-sample - An app to discuss your favourite emojis. This is a sample app built with Firebase.github.com

novoda/spikes
spikes - Where ideas & concepts are born & incubatedgithub.com

防止内存泄漏的重要守则是让内部类为静态的。尤其是它们要做耗时的后台任务的时候。或者更好的方法是把这个类移到外面作为单独的类。

用非静态的内部类做耗时的后台任务总是很糟糕的实践,不光是在安卓中。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部