为了防止内存泄漏, 将你的异步任务变成静态内部类,并且持有MyActivity的一个弱引用,当更新UI(即执行onPostExecute)的时候我们需要拿到activity的一个强引用,这个时候去判断activity的状态,是销毁了还是健在再去做处理,就避免了内存泄漏。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
...
MyAsyncTask asyncTask = new MyAsyncTask();
asyncTask.execute();//开始执行
...
}
}
static class MyAsyncTask extends AsyncTask<Void, Void, Void> {
// 弱引用是允许被gc回收的;
private final WeakReference<MyActivity> weakActivity;
MyTask(MyActivity myActivity) {
this.weakActivity = new WeakReference<>(myActivity);
}
@Override
public Void doInBackground(Void... params) {
// do async stuff here
}
@Override
public void onPostExecute(Void result) {
MyActivity activity = weakActivity.get();
if (activity == null || activity.isFinishing() || activity.isDestroyed()) {
return;
}
// 继续更新ui
}
}
public abstract class AsyncTask<Params, Progress, Result>
AsyncTask为抽象类,并且有三个泛型:
params:参数,在execute() 传入,可变长参数,跟 doInBackground(Void… params) 这里的params类型一致
Progress:执行的进度,跟onProgressUpdate(Integer… values) 的values的类型一致,一般情况为Integer
Result:返回值,跟String doInBackground 返回的参数类型一致,且跟onPostExecute(String s) 的s参数一致,在耗时操作执行完毕调用。