我是靠谱客的博主 辛勤鼠标,这篇文章主要介绍HandleThread的分析一、HandleThread的分析二、ThreadHandle简单Demo,现在分享给大家,希望可以做个参考。

一、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内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(63)

评论列表共有 0 条评论

立即
投稿
返回
顶部