zoukankan      html  css  js  c++  java
  • 及时取消代码中的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循环。

  • 相关阅读:
    眼过千遍不如手过一遍!
    等老了,做一个视频编辑
    不建议用wxWidgets,底层有过多的bug
    MFC新婚之夜(笑昏,大概是指MFC的人固步自封)
    Twitter算法
    Ruby on rails3
    重提基数排序
    Hashtable Dictionary List
    try { var mergeFilePath = string.Format("{0}mergepdf.pdf", tempDownDir); PDFPrintHelper.MergePDFFile(pdfList, mergeFi
    查找树
  • 原文地址:https://www.cnblogs.com/mosthink/p/5289082.html
Copyright © 2011-2022 走看看