-
Handler的post(Runnable)用法。查看全部
-
为什么用Handler.查看全部
-
handler是什么,以及作用。查看全部
-
非UI线程能否更新UI --->刚启动的时候,立即在非UI线程更新->不报错。 --->休眠2s钟以后,更新——————>报错 更新UI-->会调用checkForRelayout()方法 -->invalidate()方法-->invalidate(true)方法,关注viewParent-->ViewRootImpl是ViewParent的实现类查看全部
-
更新UI的4种方式: 1.通过Handle的post方法(); 2.调用Handle.sendMessage()方法;传统的方法 3.重写Activity中的runOnUIThread方法更新; 4.调用View自身的post(Runnable run)方法更新;查看全部
-
HandlerThread的用处: 创建Handler的时候可以指定Looper,所以这个Looper对象可以是别的线程创建的。所以Handler中MessageQueue的轮询不一定非要是创建Handler的线程进行,还可以别的线程进行。但是进行的时候需要我们保证传入的looper对象已经被别的线程创建好了,否则会出现空指针异常。这个时候我们就需要使用HandlerThread这个类来创建这个Looper了。 http://developer.android.com/reference/android/os/HandlerThread.html 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.查看全部
-
创建Handler的时候可以指定Looper,所以这个Looper对象可以是别的线程创建的。所以Handler中MessageQueue的轮询不一定非要是创建Handler的线程进行,还可以别的线程进行。查看全部
-
在主线程中创建的Handler的handleMessage()方法不要写耗时的操作,否则会导致UI卡死,因为这个handleMessage()方法是在UI线程中调用的。查看全部
-
创建一个与线程相关的Handler: 1. 在线程中通过Looper.prepare()方法创建一个与线程相关的Looper对象; 2. 在线程中通过Handler的new关键字,创建一个Handler对象,这个对象在创建的时候会关联上1中创建的Looper对象 3. 调用Looper对象的loop()方法去轮询它的MessageQueue 4. 通过其他的线程拿到这个线程的Handler对象之后调用sendMessage()之后,在这个线程中就可以进行Message的处理了。 我们一般是在主线程中创建Handler对象,在主线程中处理Message,在子线程中调用这个Handler对象的sendMessage()来发送message。所以Handler是在哪个线程创建就有哪个线程处理Message和轮询,而由别的线程负责给这个Handler发送Message。查看全部
-
Handler sendMessage图解查看全部
-
当我们将Handler在主线程(UI线程)中创建的时候,Handler对象会关联一个Looper对象,这个Looper对象不是我们创建的,是早就由ActivityThread的main线程(ActivityThread的main线程就是负责创建和更新UI和轮询消息的,和我们开发window应用一样,它有个大循环在里面,在这个大循环中,Looper对象会不断的去调用loop()方法进行消息轮询)创建好了的,而这个Looper对象里面就有就有它的MessageQueue对象(其实就是一个以linked list形式保存Message对象的数据结构)。查看全部
-
总结:Handler负责发送消息和处理消息;Looper负责接收消息和轮询消息,并且将消息转发给Handler自己,由Handler自己在不同的线程中处理消息;MessageQueue就是一个消息的容器,Looper内部包含了MessageQueue对象的引用,就是通过这个容器,Looper才能完成对消息的轮询(通过loop()方法)。查看全部
-
Handler和Looper和MessageQueue之间的关系:Handler对象中既有Looper对象的引用也有MessageQueue对象的引用,其中MessageQueue是通过它的Looper对象的一个mQueue属性获取的,而Looper的对象是创建Handler的线程创建的(创建Looper对象需要调用它的静态方法prepare()创建,不能直接new出来),Looper的对象是通过当前创建Handler的线程创建的,并且要保证这个线程要去调用Looper对象的loop()方法进行Message的轮询(在loop()内部会调用一些native的方法完成本地的消息轮询),如果要退出轮询,可以调用Looper对象的quit()方法。UI线程(主线程)已经帮我们做好了这一切,所以,如果我们在主线程中创建Handler,那么就是由主线程自动帮我们去轮询我们的MessageQueue,所以我们在子线程中调用Handler对象的post(),sendMessage(),才能在主线程(UI线程)中处理我们的Message,而且才能在主线程(UI线程)中更新我们的UI。 其实post(),postDelayed(), sendMessage(), sendMessageDelayed() 这四个方法本质都是调用的sendMessageAtTime()这个方法,只是post对runnable对象进行了包装,包装成了Message对象,而这个Message对象的callback就是runnable,最后我们在选择Message处理方法的时候,优先看这个Message对象有没有callback对象,如果有,就调用这个callback对象,然后再看整个handler对象有没有callback对象,如果有,就调用这个callback对象的handleMessage()方法处理Message对象,如果没有则调用handler对象本身的handleMessage方法处理Message,所以Message的处理是有优先级的。查看全部
-
为什么Android要设计只能通过UI线程去更新UI呢?查看全部
-
1、使用Handler在子线程中向ui线程发送一个消息进行UI的更新; 2、创建一个Message; Message msg = new Message(); msg.arg1=88; 3、handler.sendMessage(msg); // 最终导致同一个handler对象的handleMessage()方法被创建Handler对象的线程(一般在主线程中创建)回调,然会这个传入的msg会被当成参数传给handleMessage()方法的。这个时候我们就可以对Message对象做一些处理了,而且这个时候我们所处的线程一般就在UI线程中了,所以这个时候我们更新UI就没有问题了。 msg.obj=xxx; 可以传递一个对象; 4、复用系统的message对象 Message msg = handler.obtainMessage(); // or Message.obtain(); msg.sendtoTarget(); 也可以发送到Handler对Message进行处理 handler.removeCallbacks(Runnable r); 如前面所说,我们除了在Handler对象的handleMessage()方法中处理Message对象,还可以在Handler对象创建的时候传入一个Callback对象,用这个Callback对象来处理Message对象;注意:callback接口中handleMessage(Message msg)中若截获则一定返回true; 这个callback看起来不错哟查看全部
举报
0/150
提交
取消