美文网首页
HandlerThread的简单使用

HandlerThread的简单使用

作者: ironman_ | 来源:发表于2017-07-01 01:12 被阅读0次

    HandlerThread里会有一个自己的looper,不需要我们去管理他的状态
    但是我们还是需要手动去调用一下start。

    可以通过HandlerThread.getLooper来创建handler,从而给这个ThreadHandler发送消息。

    主要代码片段:

    handlerThread = new HandlerThread("autoFocus");
    handlerThread.start();
    handler = new Handler(handlerThread.getLooper(), this);
    

    caution:一定要等到handlerThread start之后才可以去通过他的looper创建handler,否则会有问题。
    这里创建了一个HandlerThread,然后启动了他,再创建了一个能发送消息到这个线程的handler,这时候我们就可以往这个线程里丢东西了。

    这里有一个自动循环对焦的HandlerThread的实现:

    final class AutoFocusManager implements Camera.AutoFocusCallback , Handler.Callback{
    
       private static final String TAG = AutoFocusManager.class.getSimpleName();
       private static final int MSG_AUTO_FOCUS = 123;
    
       private static final long AUTO_FOCUS_INTERVAL_MS = 1000L;
    
       private boolean active;
       private final Camera camera;
       private Handler handler;
       private HandlerThread handlerThread;
    
       AutoFocusManager(Context context, Camera camera) {
          this.camera = camera;
          handlerThread = new HandlerThread("autoFocus");
          handlerThread.start();
          handler = new Handler(handlerThread.getLooper(), this);
          start();
       }
    
       @Override
       public boolean handleMessage(Message msg) {
          if (msg != null) {
             switch (msg.what) {
                case MSG_AUTO_FOCUS:
                   requestFocus();
                   break;
             }
          }
          return false;
       }
    
       private void requestFocus() {
          if (active) {
             try {
                camera.autoFocus(this);
             } catch (RuntimeException re) {
                QLog.e(re);
             }
          }
       }
    
       @SuppressWarnings("unchecked")
       @SuppressLint("NewApi")
       @Override
       public synchronized void onAutoFocus(boolean success, Camera theCamera) {
          if (success) {
             QLog.e("autofocus", "auto focus success");
          } else {
             QLog.e("autofocus", "auto focus fail");
          }
          if (active) {
             handler.sendEmptyMessageDelayed(MSG_AUTO_FOCUS, AUTO_FOCUS_INTERVAL_MS);
          }
       }
    
       private void start() {
          active = true;
          handler.sendEmptyMessage(MSG_AUTO_FOCUS);
       }
    
       synchronized void stop() {
          try {
             camera.cancelAutoFocus();
          } catch (RuntimeException re) {
             QLog.e(TAG, "Unexpected exception while cancelling focusing", re);
          }
          active = false;
          if (handlerThread != null) {
             handlerThread.quit();
          }
       }
    }
    

    相关文章

      网友评论

          本文标题:HandlerThread的简单使用

          本文链接:https://www.haomeiwen.com/subject/cjkwcxtx.html