1.HandlerThread介绍
Handy class for starting a new thread that has a looper. The looper can then be used to create handler classes. Note that start() must still be called.
HandlerThread继承自Thread类。在创建一个HandlerThread方法时候,我们可以得到一个这个线程里面带的Looper,这个Looper我们可以在创建Handler时候调用。HandlerThread我们必须使用它的start() 方法来调用这个线程。 一个handler与看个线程相关,我们需要看的是他调用的是那个线程的getLooper()方法。默认是主线程的looper,因为主线程中有了looper,UI主线程初始化第一个Handler时会通过ThreadLocal创建一个Looper,该Looper与UI主线程一一对应。
2.使用方法
- 2.1创建一个HandlerThread实例
- 2.2调用实例的start()方法
- 2.3创建一个与HandlerThread线程相关的handler
- 2.4使用handler发送消息
3.自己写一个MyThread希望可以实现上面的内容
12345678910111213141516171819/***集成了handlerThread类*@authorqiwenming**/classMyThreandextendsThread{publicHandlermHandler;@Overridepublicvoidrun(){Looper.prepare();mHandler=newHandler(){@OverridepublicvoidhandleMessage(Messagemsg){System.out.println("MyThreand----当前线程:"+Thread.currentThread());}};Looper.loop();}}
我们调用的时候,得分开调用(不靠谱)
1234567891011121314151617/***创建handler为什么不在这里面调用 myThread.mHandler.sendEmptyMessage(1);*是因为mHandler可能会抛空指针异常所以我把创建和调用分开。*@paramv*/publicvoidtoCreateHandler(Viewv){myThread=newMyThreand();myThread.start();}/***执行handler*@paramv*/publicvoidtoExcuteHandler(Viewv){myThread.mHandler.sendEmptyMessage(1);mHandler.sendEmptyMessage(1);}
4.我们写一个Handler的子类
调用
12345678910111213141516/***我的handler*@authorqiwenming**/classMyHandlerextendsHandler{publicMyHandler(){}publicMyHandler(Looperlooper){super(looper);//调用与线程相关的looper}@OverridepublicvoidhandleMessage(Messagemsg){System.out.println("MyHandler----当前线程:"+Thread.currentThread());}}
1234567//创建一个含有looper的线程,县成名叫做handlerThreadHandlerThreadmHThread=newHandlerThread("handlerThread");mHThread.start();//开始它//创建一个我们自己复写Handler的实例,并且调用的的是mHThread线程的looper,这个handler和mHThread相关MyHandlermyHandler=newMyHandler(mHThread.getLooper());//发送一个消息myHandler.sendEmptyMessage(1);
5.所有的代码
5.1 布局文件
1234567891011121314151617181920212223<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity"><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="创建与线程相关的Handler"android:onClick="toCreateHandler"></Button><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="调用handler"android:onClick="toExcuteHandler"></Button><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="创建并调用HandlerThread"android:onClick="toHandlerThread"></Button></LinearLayout>
5.2 Activity代码
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118packagecom.example.handlerdemo;importandroid.app.Activity;importandroid.os.Bundle;importandroid.os.Handler;importandroid.os.HandlerThread;importandroid.os.Looper;importandroid.os.Message;importandroid.view.View;/***Handler使用详情**@authorqiwenming**/publicclassMainActivityextendsActivity{publicHandlermHandler=newHandler(){publicvoidhandleMessage(Messagemsg){System.out.println("CurentThread:"+Thread.currentThread());}};publicMyThreandmyThread;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}/***创建handler为什么不在这里面调用 myThread.mHandler.sendEmptyMessage(1);*是因为mHandler可能会抛空指针异常所以我把创建和调用分开。*@paramv*/publicvoidtoCreateHandler(Viewv){myThread=newMyThreand();myThread.start();}/***执行handler*@paramv*/publicvoidtoExcuteHandler(Viewv){myThread.mHandler.sendEmptyMessage(1);mHandler.sendEmptyMessage(1);}/***集成了handlerThread类*@authorqiwenming**/classMyThreandextendsThread{publicHandlermHandler;@Overridepublicvoidrun(){Looper.prepare();mHandler=newHandler(){@OverridepublicvoidhandleMessage(Messagemsg){System.out.println("MyThreand----当前线程:"+Thread.currentThread());}};Looper.loop();}}//###########################################################################################/***创建和执行HandlerThread*@paramv*/publicvoidtoHandlerThread(Viewv){//创建一个含有looper的线程,县成名叫做handlerThreadHandlerThreadmHThread=newHandlerThread("handlerThread");mHThread.start();//开始它//创建一个我们自己复写Handler的实例,并且调用的的是mHThread线程的looper,这个handler和mHThread相关MyHandlermyHandler=newMyHandler(mHThread.getLooper());//发送一个消息myHandler.sendEmptyMessage(1);//创建一个我们定义的handler的实例,没有指定调用的looper,这里调用的就是主线程的handlerMyHandlermyHandler1=newMyHandler();myHandler1.sendEmptyMessage(1);//创建一个Handler实例,是他与mHThread相关HandlermHandler=newHandler(mHThread.getLooper()){@OverridepublicvoidhandleMessage(Messagemsg){System.out.println("Handler----当前线程:"+Thread.currentThread());}};mHandler.sendEmptyMessage(1);}/***我的handler*@authorqiwenming**/classMyHandlerextendsHandler{publicMyHandler(){}publicMyHandler(Looperlooper){super(looper);//调用与线程相关的looper}@OverridepublicvoidhandleMessage(Messagemsg){System.out.println("MyHandler----当前线程:"+Thread.currentThread());}}}
本文详细介绍了HandlerThread的基本概念、使用方法及其实现细节。通过具体的代码示例,展示了如何创建HandlerThread,与其相关的Handler,以及如何利用它们进行跨线程的消息传递。

被折叠的 条评论
为什么被折叠?



