避免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/spikes
spikes - Where ideas & concepts are born & incubatedgithub.com
防止内存泄漏的重要守则是让内部类为静态的。尤其是它们要做耗时的后台任务的时候。或者更好的方法是把这个类移到外面作为单独的类。
用非静态的内部类做耗时的后台任务总是很糟糕的实践,不光是在安卓中。