多线程并发——AsyncTask

本文介绍了一种防止Android应用中内存泄漏的方法:通过将异步任务转换为静态内部类并持有Activity的弱引用。文章详细展示了如何实现这一方案,确保在更新UI时检查Activity的状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为了防止内存泄漏, 将你的异步任务变成静态内部类,并且持有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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值