android线程中 创建线程的方法,Android App在线程中创建handler的方法讲解

相关概念1.Handler:可以看做是一个工具类,用来向消息队列中插入消息的;

2.Thread:所有与Handler相关的功能都是与Thread密不可分的,Handler会与创建时所在的线程绑定;

3.Message:消息;

4.MessageQueue:消息队列,对消息进行管理,实现了一个Message链表;

5.Looper:消息循环,从MessageQueue中取出Message进行处理;

6.HandlerThread:继承Thread,实例化时自动创建Looper对象,实现一个消息循环线程.

在Android开发中经常会使用到线程,一想到线程,一般都会想到:

1new Thread(){...}.start();

这样的方式。这样如果在一个Activity中多次调用上面的代码,那么将创建多个匿名线程,如果这些线程的没有被销毁,那肯定会影响性能呢。这个时候我么就想到了android提供的一个异步处理线程的类HandlerThread。

一般Handler的用法

1Handler handler =new Handler(){...};

这样创建的handler是在主线程即UI线程下的Handler,即这个Handler是与UI线程下的默认Looper绑定的(当然也只有主线程才能这么干,子线程是干不了的,除非自己创建个looper)。因此,有些时候会占用ui主线程,引起一些问题,所以我们就想到了重新创建个子线程,来处理handler。。。。

使用HandlerThread解决问题

HandlerThread实际上继承于Thread,只不过它比普通的Thread多了一个Looper。我们可以使用下面的例子创建Handler

1

2HandlerThread thread =new HandlerThread("MyHandlerThread");

thread.start();

创建HandlerThread时要把它启动了,即调用start()方法。

接着就是handler的使用,如下:

1

2mHandler =new Handler(thread.getLooper());

//TODO:you can post or send something....

创建Handler时将HandlerThread中的looper对象传入。那么这个mHandler对象就是与HandlerThread这个线程绑定了(这时就不再是与UI线程绑定了,这样它处理耗时操作将不会阻塞UI)。

线程中消息处理的流程图

92100474_1

消息插入队列的位置由参数uptimeMillis来确定。

Handler与线程的关系

92100474_2

1.HandlerThread就是一个封装了Looper的Thread.

2.Handler会与实例化时所在的线程绑定.

UI线程与子线程通信相关

92100474_3

1.需要更新UI,则需要使用与主线程绑定的Handler发送消息,若使用在子线程中创建的Handler则会抛出异常;

2.子线程中实例化Handler对象首先需要调用Looper.prepare(),否则会抛出异常;

3.调用Looper.loop()方法消息循环才会启动;

使用Handler时一些需要注意的地方

Looper.prepare(),主线程使用handler,系统默认prepare了,子线程中创建handler必须在前面Looper.prepare(),后面加上Looper.loop();

源码中:

主线程:

在程序启动的时候,系统已经帮我们自动调用了Looper.prepare()方法。查看ActivityThread中的main()

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19public static void main(String[] args) {

SamplingProfilerIntegration.start();

CloseGuard.setEnabled(false);

Environment.initForCurrentUser();

EventLogger.setReporter(new EventLoggingReporter());

Process.setArgV0("");

Looper.prepareMainLooper();

ActivityThread thread =new ActivityThread();

thread.attach(false);

if (sMainThreadHandler ==null) {

sMainThreadHandler = thread.getHandler();

}

AsyncTask.init();

if (false) {

Looper.myLooper().setMessageLogging(new LogPrinter(Log.DEBUG,"ActivityThread"));

}

Looper.loop();

throw new RuntimeException("Main thread loop unexpectedly exited");

}

请注意Looper.prepareMainLooper():

1

2

3

4

5

6

7public static final void prepareMainLooper() {

prepare();

setMainLooper(myLooper());

if (Process.supportsProcesses()) {

myLooper().mQueue.mQuitAllowed =false;

}

}

子线程:

1

2

3

4

5

6

7

8new Thread(new Runnable() {

@Override

public void run() {

Looper.prepare()

handler2 =new Handler();

Looper.loop()

}

}).start();

如果没有Looper.prepare().会报错:

Can't create handler inside thread that has not called Looper.prepare()

因为没looper对象创建

looper.prepare()源码:

1

2

3

4

5

6

7public static final void prepare() {

if (sThreadLocal.get() !=null) {

throw new RuntimeException("Only one Looper may be created per thread");

}

sThreadLocal.set(new Looper());

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值