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
*
*/
class
MyThreand
extends
Thread{
public
HandlermHandler;
@Override
public
voidrun(){
Looper.prepare();
mHandler=
new
Handler(){
@Override
public
voidhandleMessage(Messagemsg){
System.out.println(
"MyThreand----当前线程:"
+Thread.currentThread());
}
};
Looper.loop();
}
}
我们调用的时候,得分开调用(不靠谱)
1234567891011121314151617
/**
*创建handler为什么不在这里面调用 myThread.mHandler.sendEmptyMessage(1);
*是因为mHandler可能会抛空指针异常所以我把创建和调用分开。
*@paramv
*/
public
voidtoCreateHandler(Viewv){
myThread=
new
MyThreand();
myThread.start();
}
/**
*执行handler
*@paramv
*/
public
voidtoExcuteHandler(Viewv){
myThread.mHandler.sendEmptyMessage(1);
mHandler.sendEmptyMessage(1);
}
4.我们写一个Handler的子类
调用
12345678910111213141516/**
*我的handler
*@authorqiwenming
*
*/
class
MyHandler
extends
Handler{
public
MyHandler(){
}
public
MyHandler(Looperlooper){
super(looper);
//调用与线程相关的looper
}
@Override
public
voidhandleMessage(Messagemsg){
System.out.println(
"MyHandler----当前线程:"
+Thread.currentThread());
}
}
1234567
//创建一个含有looper的线程,县成名叫做handlerThread
HandlerThreadmHThread=
new
HandlerThread(
"handlerThread"
);
mHThread.start();
//开始它
//创建一个我们自己复写Handler的实例,并且调用的的是mHThread线程的looper,这个handler和mHThread相关
MyHandlermyHandler=
new
MyHandler(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代码
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118package
com.example.handlerdemo;
import
android.app.Activity;
import
android.os.Bundle;
import
android.os.Handler;
import
android.os.HandlerThread;
import
android.os.Looper;
import
android.os.Message;
import
android.view.View;
/**
*Handler使用详情
*
*@authorqiwenming
*
*/
public
class
MainActivity
extends
Activity{
public
HandlermHandler=
new
Handler(){
public
void
handleMessage(Messagemsg){
System.out.println(
"CurentThread:"
+Thread.currentThread());
}
};
public
MyThreandmyThread;
@Override
protected
void
onCreate(BundlesavedInstanceState){
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
/**
*创建handler为什么不在这里面调用 myThread.mHandler.sendEmptyMessage(1);
*是因为mHandler可能会抛空指针异常所以我把创建和调用分开。
*@paramv
*/
public
void
toCreateHandler(Viewv){
myThread=
new
MyThreand();
myThread.start();
}
/**
*执行handler
*@paramv
*/
public
void
toExcuteHandler(Viewv){
myThread.mHandler.sendEmptyMessage(
1
);
mHandler.sendEmptyMessage(
1
);
}
/**
*集成了handlerThread类
*@authorqiwenming
*
*/
class
MyThreand
extends
Thread{
public
HandlermHandler;
@Override
public
void
run(){
Looper.prepare();
mHandler=
new
Handler(){
@Override
public
void
handleMessage(Messagemsg){
System.out.println(
"MyThreand----当前线程:"
+Thread.currentThread());
}
};
Looper.loop();
}
}
//###########################################################################################
/**
*创建和执行HandlerThread
*@paramv
*/
public
void
toHandlerThread(Viewv){
//创建一个含有looper的线程,县成名叫做handlerThread
HandlerThreadmHThread=
new
HandlerThread(
"handlerThread"
);
mHThread.start();
//开始它
//创建一个我们自己复写Handler的实例,并且调用的的是mHThread线程的looper,这个handler和mHThread相关
MyHandlermyHandler=
new
MyHandler(mHThread.getLooper());
//发送一个消息
myHandler.sendEmptyMessage(
1
);
//创建一个我们定义的handler的实例,没有指定调用的looper,这里调用的就是主线程的handler
MyHandlermyHandler1=
new
MyHandler();
myHandler1.sendEmptyMessage(
1
);
//创建一个Handler实例,是他与mHThread相关
HandlermHandler=
new
Handler(mHThread.getLooper()){
@Override
public
void
handleMessage(Messagemsg){
System.out.println(
"Handler----当前线程:"
+Thread.currentThread());
}
};
mHandler.sendEmptyMessage(
1
);
}
/**
*我的handler
*@authorqiwenming
*
*/
class
MyHandler
extends
Handler{
public
MyHandler(){
}
public
MyHandler(Looperlooper){
super
(looper);
//调用与线程相关的looper
}
@Override
public
void
handleMessage(Messagemsg){
System.out.println(
"MyHandler----当前线程:"
+Thread.currentThread());
}
}
}