A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 武汉分校-小舞 于 2016-3-15 14:11 编辑

【武汉校区】技术分享:HandlerThread之自已的消息队列

        Android开发中我们在子线程中更新UI的时候,通常都会使用到Handler向主线程的消息队列发一条消息。然后主线程收到消息后在主线程中执行更新UI的操作。
        Handler本质上来说是完成了不同线程中的通信。只是我们通常都是从子线程中向主线程的消息队列发消息。那我们怎么自已来开一个线程接受其它线程的消息呢?
        Android提供了一个HandlerThread类,通过这个类我们轻易的实现一个自已的消息队列来接受其它线程的消息。使用HandlerThread类来创建一个消息收消息只要如下所示
/**
        * 开启一个子线程收消息
        * @param view
        */
       public void clickReceive(View view){
              //开启一个名子为itcast的子线程收消息
              HandlerThreadhandlerThread = new HandlerThread("itcast");//itcast是新开的收消息的子线程的名子
              handlerThread.start();
              
              looper= handlerThread.getLooper();
       }
开启线程后,我们就可以在其它线程给我们的itcast线程的消息对列发消息。然后itcast线程就可以收到了。发消息需要拿到itcast线程的Looper
/**
        * 在主线程中给itcast线程发一条消息
        * @param view
        */
       public void clickSend(View view){
              Handlerhandler = new Handler(looper){
                     @Override
                     public void handleMessage(Message msg){
                            Log.i("test",Thread.currentThread().getName() + "线程中接到了来自主线程的消息");
                     }
              };
              Messagemessage = Message.obtain();
              handler.sendMessage(message);
       }
如果想停止itcast线程收消息怎么办? 我们只要调用itcast线程的Looper对象的quit()方法
/**
        * 停止收消息
        * @param view
        */
       public void clickStop(View view){
              looper.quit();
       }
下面是完整的例子代码
public class MainActivity extendsActivity {
       @Override
       protected void onCreate(Bundle savedInstanceState){
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
       }
      
       Looper looper;
       /**
        * 开启一个子线程收消息
        * @param view
        */
       public void clickReceive(View view){
              //开启一个名子为itcast的子线程收消息
              HandlerThreadhandlerThread = new HandlerThread("itcast");//itcast是新开的收消息的子线程的名子
              handlerThread.start();
              
              looper= handlerThread.getLooper();
       }
      
       /**
        * 在主线程中给itcast线程发一条消息
        * @param view
        */
       public void clickSend(View view){
              Handlerhandler = new Handler(looper){
                     @Override
                     public void handleMessage(Message msg){
                            Log.i("test",Thread.currentThread().getName() + "线程中接到了来自主线程的消息");
                     }
              };
              Messagemessage = Message.obtain();
              handler.sendMessage(message);
       }
      
      
       /**
        * 停止收消息
        * @param view
        */
       public void clickStop(View view){
              looper.quit();
       }
}
Xml布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${relativePackage}.${activityClass}"
    android:orientation="vertical">
    <Button
        android:onClick="clickReceive"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="开启子线程收消息" />
   
   
     <Button
         android:onClick="clickSend"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="从主线程给子线程发一条消息" />
     
     <Button
         android:onClick="clickStop"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="停止子线程收消息" />
</LinearLayout>
本帖持续跟新,想最快获最新技术分享请加QQ  1641907557 ,后期会分享更多与实体班同步教程,助你冲击月薪20K

推荐阅读:


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马