避免AsyncTask内存泄漏的简单例子:java
Activity代码:android
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:git
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); } }
总体思路:github
经过注册接口回调的方式,处理AsyncTask返回的数据。app
novoda/spikes
spikes - Where ideas & concepts are born & incubatedgithub.comui
防止内存泄漏的重要守则是让内部类为静态的。尤为是它们要作耗时的后台任务的时候。或者更好的方法是把这个类移到外面做为单独的类。this
用非静态的内部类作耗时的后台任务老是很糟糕的实践,不光是在安卓中。idea