Season5 ep5的主题是HandlerThread
link
A Case – Camera Preview
在大部分场景下,AsyncTask已经可以满足我们的功能需求。不过,AsyncTask并不是对于各种场景全都适用的。对于特别耗时的操作,如照相机的预览图绘制。
1 | public abstract void onPreviewFrame (byte[] data, Camera camera); |
onPreviewFrame
放在主线程中执行的话,会因为大量时间用于计算而产生丢帧,方案一pass!
放在AsyncTask中执行的话,因为自身的耗时特别长,导致后续任务始终得不到执行,方案二pass!
How?
基于上面的考虑,我们需要有这样一个独立于主线程、可以执行冗长任务的机制,来完成照相机预览图的获取。
让我们来认识一下HandlerThread。HandlerThread
继承自java.lang.Thread
,可以通过getLooper()
的方法来获取某个HandlerThread
的Looper,拿到Looper之后,就可以通过它创建一个Handler,进而用这个Handler处理预览图绘制这样的工作了。
demo见下面的代码片段
1 | HandlerThread handlerThread = new HandlerThread("photo preview"); |
当计算完成后,就可以通过Activity.runOnUIThread(Runnable r)
来更新预览图了。
HandlerThread
不仅可以处理冗长的触发UI事件,也可以用它来做UI无关的事情。
Priority
创建HandlerThread
时,记得根据实际需求赋予它适当的优先级,这会使cpu为它分配合适的执行顺序。