• 及时取消代码中的AsyncTask


    在一个Activity页面,如果发起了AsyncTask任务,然后页面离开/销毁了,此时如果doInBackground没执行完,会有两个问题:

    1, AsyncTask白白消耗资源,结果已经用不上了,因为UI也不在;

    2, AsyncTask如果声明为Activity的内部类,会持有Activity这个宿主类,导致Activity内存泄露。

    所以一定要在Activity onDestory的时候cancel掉AsyncTask任务。

    怎么从一个App的架构层面来约束所有的业务模块都自动做这个事情呢?

    1, 自定义一个AutoCancelAsyncTask,继承AsyncTask,定义一个成员变量,叫id。

    2, 定义一个TaskManager单例类,维护一个AutoCancelAsyncTask队列。

    3, 在AutoCancelAsyncTask的构造方法中,把自己加到TaskManager的队列。

    4, 在AutoCancelAsyncTask中重写onCancelled和onPostExcute方法,调用TaskManager的一个方法,这个方法从队列中删除id对应的AutoCancelAsyncTask。

    5, 定义BaseActivity,这个类生成一个唯一标识自己的id。

    6, 业务Activity都继承BaseActivity,发起的AsyncTask都继承AutoCancelAsyncTask,并传入activity的唯一id给AutoCancelAsyncTask的id。

    7, 在BaseActivity的onDestory方法中调用TaskManager的一个方法,这个方法接收当前activity的id,然后遍历队列,找到与传入的id相同的AutoCancelAsyncTask,然后调用其cancel方法。

    PS:

    1, 如果害怕业务子类重写AutoCancelAsyncTask的onCancelled或者onPostExcute的时候不调用super导致没从队列中删除这个Task,可以final这两个方法,给子类另外留两个接口出来;

    2, 假如doInBackground中是个慢操作任务,调用cancel基本都能取消掉提现结束;但如果是个循环,没用! 所以好的做法是在循环的条件判断中假如this.isCancelled()判断,如果是true,直接break循环。

  • 相关阅读:
    AD转化器分类及特点和选用
    采样频率 、采样率
    RGBA alpha 透明度混合算法
    SDRAM中数据掩码的作用
    Allegro---层叠结构设置
    PCB主线布线规范—高速线之DDR2
    Allegro 反射仿真--拓扑结构的提取提取及波形分析
    Allegro 反射仿真--仿真设置
    Allegro 反射仿真--IBIS模型转化
    SigXplorer设置延时及Local_Global
  • 原文地址:https://www.cnblogs.com/mosthink/p/5289082.html
Copyright © 2020-2023  润新知