多线程并发——AsyncTask

论坛 期权论坛 脚本     
已经匿名di用户   2022-5-29 19:35   1606   0

为了防止内存泄漏, 将你的异步任务变成静态内部类,并且持有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参数一致,在耗时操作执行完毕调用。

转载于:https://my.oschina.net/fltsp/blog/1611808

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:81
帖子:4969
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP