一、HandleThread的分析
从名称就可以看出,HandleThread是Handle和Thread的‘结合’,但它本质上还是个Thread。
复制代码
1
2
3
public class HandlerThread extends Thread
既然它是一个线程, 那么我们就看看它的run方法
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Override
public void run() {
mTid = Process.myTid();
Looper.prepare();
synchronized (this) {
mLooper = Looper.myLooper();
notifyAll();
}
Process.setThreadPriority(mPriority);
onLooperPrepared();
Looper.loop();
mTid = -1;
}
从源码可以看出,它首先调用Looper的prepare()方法来准备,接着调用
Looper.myLooper()方法来取出当前线程的Looper,最后又调用loop()方法循环。由此可以看出HandleThread和普通Thread的区别是HandleThread在内部创建了消息队列。
二、ThreadHandle简单Demo
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<RelativeLayout 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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="点我" />
</RelativeLayout>
布局如上
复制代码
1
2
3
4
5
6
7
8
private HandlerThread handlerThread = new HandlerThread("com.lw.handlethread"){
public void run() {
super.run() ;
System.out.println("xixixixi");
};
};
创建HandleThread对象
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
handlerThread.start() ;
new Thread(){
public void run() {
System.out.println("new Thread---" + Thread.currentThread().getName());
//将handler和HandlerThread绑定起来
handler = new Handler(handlerThread.getLooper()){
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case RESEIVE:
System.out.println("当前线程:" + Thread.currentThread().getName());
break;
default:
break;
}
}
}; ;
};
}.start();
findViewById(R.id.btn).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
handler.sendEmptyMessage(RESEIVE);
}
});
}
注意:首先调用handleThread.start(),让其调用run方法,初始化Looper,否则下面代码会报错,接着在子线程中创建Handle,并且调用handleThread的getLooper()方法。
复制代码
1
2
3
4
5
6
7
8
9
findViewById(R.id.btn).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
handler.sendEmptyMessage(RESEIVE);
}
});
为按钮添加点击事件,并发送消息.
程序输出结果如下:
复制代码
1
2
3
4
07-30 23:07:32.168: I/System.out(2748): new Thread---Thread-124
07-30 23:07:42.512: I/System.out(2748): 当前线程:com.lw.handlethread
由上可知,Hanlde和HandleThread绑定到了一起。
注意:这个Demo本身没什么价值,只是简单描述了下HandleThread的作用。
最后
以上就是辛勤鼠标最近收集整理的关于HandleThread的分析一、HandleThread的分析二、ThreadHandle简单Demo的全部内容,更多相关HandleThread内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复