总结--3

主线程建立的时候会默认建立LooperHandlerThread则是内置Looper,除此以外其余的线程建立时是不会建立Looper的,需手动创健线程本身的Looperide

子线程更新主线程建立的控件引起的错误:Only the original thread that created a view hierarchy can touch its views函数

默认状况下Handler会与其被定义时所在线程的Looper绑定,好比,在主线程中定义,其是与主线程的Looper绑定。oop

HandlerThread实际上就一个Thread,只不过它比普通的Thread多了一个LooperLooper MessageQueue的关系:MessageQueueLooper类的成员变量。主线程被建立以后会默认建立Looper,这个Looper是属于主线程的,他会为主线程建立MessageQueue消息循环队列。spa

看具体代码分析:线程

wKiom1Nw4DLTdlnGAAGoyJar7Xk458.jpg

这段代码会报错,会提示说子线程不能更新主线程的控件,为何?3d


wKiom1Nw4MHRVNYeAABt5kpwY6c857.jpg

首先建立名字叫“MyHandlerThread”的线程,这个阶段同时也为这个线程默认建立了Looper(消息循环器)、和MessageQueue(消息队列)。对象

wKiom1Nw4SrjmBZJAAAxxoLctfM364.jpg

表示将Handler绑定到线程MyHandlerThreadLooper,让Handler专门来处理Looper的消息blog


wKiom1Nw4VWztcldAAEX9KdUyT4378.jpg

将实现Runnable的对象,做为Message对象传给线程MyHandlerThreadMessageQueue,当线程MyHandlerThreadLooper拿出这个消息的时候,发现这个消息是实现Runnable接口的类的对象,因而就会去掉用回调函数run(),其实就是把回调函数的代码拿到线程MyHandlerThread”里来执行。继承

若是建立一个子线程,你但愿本身的子线程可以有本身的LooperHandlerMessageQueue你有两种方法,一种是像以前建立线程同样,但要在重写的run{}方法里,为线程建立Looper,这种方法比较麻烦,能够直接使用HandlerThread,不必在重写run{},由于HandlerThreadrun()方法其中涉及到Looper的建立和启动,Looper.loop()一执行就会进入死循环,就算你重写HandlerThreadrun()也没用,那里的代码没机会被执行,由于此时正在执行Looper.loop()这个死循环。接口

继承Thread重写run()没有调用super.run()HandlerThread重写时就有:

Spuer.run()系统本身自动加的,HandlerThreadThread不大同样,他有本身的Looper,而HandlerThreadrun()方法就是来建立Looper的,系统要确保这个函数会被执行,因此要在覆盖他的函数里添加super.run()来调用HandlerThreadrun()方法。

为何在子线程内部建立Handler会报错:那是由于子线程没有Looper,你能够不要将Handler对象放在子线程,能够放在主线程,由于主线程的Looper是默认建立的,这样借用主线程的HandlerLooper来处理消息。或者你也能够为子线程建立Looper,这样子线程就有一套本身的LooperMessageQueueHandler,就能够来在子线程内处理消息,建立子线程的Looper:  Looper  looper  = Looper.myLooper ( );

相关文章
相关标签/搜索