Android - 关于工作线程的思考

半世苍凉 提交于 2019-12-31 19:08:06

 

原文地址: 「关于Android中工作者线程的思考」http://droidyue.com/blog/2015/12/20/worker-thread-in-android/

 

1、AsyncTask与内存泄漏:

  如果在Activity中使用非静态匿名类创建AsyncTask实例,会隐式持有Activity实例的引用;

  AsyncTask源码实现中,mFuture同样使用匿名内部类创建对象实例,mFuture作为执行任务最终会加入由静态成员变量SERIAL_EXECUTOR的一个ArrayDeque类型的集合中;

  当Activity需要被销毁时,处于排队的AsyncTask由于对Activity实例的引用关系,导致对应的内存不能被GC回收,出现内存泄漏;

 

2、AsyncTask 不好好工作的 cancel():

public final boolean cancel(boolean mayInterruptIfRunning) {
    mCancelled.set(true);
    return mFuture.cancel(mayInterruptIfRunning);
}

  当我们调用 cancel(false),doInBackground()仍然会执行到方法结束,结束时不会去调用onPostExecute()方法,而是调用 onCancelled()方法;

  当我们调用 cancel(true),表示打断正在执行的任务,对应结果为:

    - 如果doInBackground处于阻塞状态,如调用Thread.sleep,wait 等方法,则会抛出InterruptedException

    - 对于某些情况,可能无法打断正在执行的任务,如IO阻塞

  如果在doInBackground()方法中有一个循环操作,我们应该在循环中使用isCancelled()来判断,如果返回为true,我们应该避免执行后续无用的循环操作

 

3、Handler一些post方法:

  • post 提交优先级一般的任务
  • postAtFrontOfQueue 将优先级较高的任务加入到队列前端
  • postAtTime 指定时间提交任务
  • postDelayed 延后提交优先级较低的任务

 

4、线程优先级调整

  Android中的线程优先级和Linux系统进程优先级有些类似,其值都是从-20至19。其中Android中,开发者可以控制的优先级有:

  • THREAD_PRIORITY_DEFAULT,默认的线程优先级,值为0
  • THREAD_PRIORITY_LOWEST,最低的线程级别,值为19
  • THREAD_PRIORITY_BACKGROUND 后台线程建议设置这个优先级,值为10
  • THREAD_PRIORITY_MORE_FAVORABLE 相对THREAD_PRIORITY_DEFAULT稍微优先,值为-1
  • THREAD_PRIORITY_LESS_FAVORABLE 相对THREAD_PRIORITY_DEFAULT稍微落后一些,值为1

  为线程设置优先级也比较简单,通用的做法是在run方法体的开始部分加入下列代码:

android.os.Process.setThreadPriority(priority);

  

  参考文章:

  「Android中糟糕的AsyncTask」 http://droidyue.com/blog/2014/11/08/bad-smell-of-asynctask-in-android/

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!