美文网首页
HandlerThread解析

HandlerThread解析

作者: 几千几百几万 | 来源:发表于2019-05-17 16:42 被阅读0次

HandlerThread很多人看起来很熟悉,可能没怎么使用过。HandlerThread顾名思义是handler+Thread的结合体。都知道handle是处理异步消息的载体,而Theard是线程。我们都知道在子线程中是无法直接更新UI,需要一个桥梁连接,handler就是这样的一个角色。

1.假设我们现在需要下载一首歌。通过子线程更新下载进度,但是我们要把实时进度展示给用户看。我们可以使用handler+Thread实现如下:

private  Handler handler =new Handler(){

  @Override

  public  void handleMessage(Message msg) {

    switch(msg.what){

    case0://更细下载进度

      text.setText("下载" + process + "%");//在主线程中更新

                      break;

    case1:

                     text.setText("下载完成");//在主线程中更新UI界面

                     break;

    default:

      break;

    }

  }

};

protected   void onCreate(Bundle savedInstanceState) {

       findViewById(R.id.btn).setOnClickListener(new OnClickListener() {

  @Override

  public  void onClick(View v) {

    new Thread(){

      @Override

      publicvoid run() {

       for(inti = 0; i < 100; i++){

          try {

            Thread.sleep(300);//模拟耗时操作

                                    } catch (InterruptedException e) {

            e.printStackTrace();

          }

        handler.sendEmptyMessage(0);//发送消息到handler}

        handler.sendEmptyMessage(1);

                         }

      }.start();

    }

  });

}

以上是通过handler+Thread实现子线程和主线程通讯。使用这种方式需要重写looper;而HandlerThread完美结合了handler和Thread的功能。

HandlerThread使用:

//1.初始化,参数为名字

myHandlerThread =new HandlerThread("hThread");

//必须调用start方法,为后面的handler提供looper

myHandlerThread .start();

//初始化Handler,只是传递了一个mHandlerThread内部的一个

looperHandler =new Handler(myHandlerThread .getLooper()) {

       @Override

        public void handleMessage(Message msg){

        super.handleMessage(msg);

     }

}

//使用

public void setThread(View view){

     new setThread (mHandler).start();

}

private  final class setThread extends Thread{

      private Handler tHandler;

      setThread(Handler handler) { this.tHandler = handler; }

          @Override

          public void run()  {

          super.run();

          for(inti =0; i <4; i++){

             tHandler.sendEmptyMessage(0x1);

            sleep(1000);

           }

    }

}

总结:

1.如果我们有耗时的任务处理可以通过HandlerThread获取looper,looper进而构造Handler,然后通过Handler的post(Runnable r)在handleMessage里进行处理耗时处理。

2.使用HandlerThread子线程和主线程通信更加方便。

相关文章

网友评论

      本文标题:HandlerThread解析

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