Season5 ep5的主题是HandlerThread
link


A Case – Camera Preview

在大部分场景下,AsyncTask已经可以满足我们的功能需求。不过,AsyncTask并不是对于各种场景全都适用的。对于特别耗时的操作,如照相机的预览图绘制。

1
public abstract void onPreviewFrame (byte[] data, Camera camera);

onPreviewFrame放在主线程中执行的话,会因为大量时间用于计算而产生丢帧,方案一pass!

放在AsyncTask中执行的话,因为自身的耗时特别长,导致后续任务始终得不到执行,方案二pass!


How?

基于上面的考虑,我们需要有这样一个独立于主线程、可以执行冗长任务的机制,来完成照相机预览图的获取。

让我们来认识一下HandlerThreadHandlerThread继承自java.lang.Thread,可以通过getLooper()的方法来获取某个HandlerThread的Looper,拿到Looper之后,就可以通过它创建一个Handler,进而用这个Handler处理预览图绘制这样的工作了。

demo见下面的代码片段

1
2
3
4
HandlerThread handlerThread = new HandlerThread("photo preview");
handlerThread.start();
Handler handler = new Handler(handlerThread.getLooper());
handler.sendMessage(Handler.obtainMessage(0)); // 在handleMessage方法中绘制预览图

当计算完成后,就可以通过Activity.runOnUIThread(Runnable r)来更新预览图了。

HandlerThread不仅可以处理冗长的触发UI事件,也可以用它来做UI无关的事情。

Priority

创建HandlerThread时,记得根据实际需求赋予它适当的优先级,这会使cpu为它分配合适的执行顺序。


===Ending===