原文地址: 「关于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
,默认的线程优先级,值为0THREAD_PRIORITY_LOWEST
,最低的线程级别,值为19THREAD_PRIORITY_BACKGROUND
后台线程建议设置这个优先级,值为10THREAD_PRIORITY_MORE_FAVORABLE
相对THREAD_PRIORITY_DEFAULT
稍微优先,值为-1THREAD_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/
来源:https://www.cnblogs.com/null2/p/5612210.html