Handler详解系列——利用Handler在主线程与子线程之间互发消息,handler详解
来源:互联网 发布:js radio check 编辑:程序博客网 时间:2024/04/26 15:34
MainActivity如下:
package cc.c;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Looper;import android.os.Message;import android.widget.TextView;/** * Demo描述: * * 示例步骤如下: * 1 子线程给子线程本身发送消息 * 2 收到1的消息后,子线程给主线程发送消息 * 3 收到2的消息后,主线程给子线程发送消息 * * 为实现子线程给自己本身发送消息,关键还是在于构造Handler时传入的Looper. * 在此就传入该子线程自己的Looper即调用Looper.myLooper(),代码如下: * Looper.prepare(); * mHandlerTest1=new HandlerTest1(Looper.myLooper()); * Looper.loop(); * * 所以当mHandlerTest1.sendMessage(message);发送消息时 * 当然是发送到了它自己的消息队列. * * 当子线程中收到自己发送的消息后,可继续发送消息到主线程.此时只要注意构造 * Handler时传入的Handler是主线程的Handler即可,即getMainLooper(). * 其余没啥可说的. * * * 在主线程处理消息后再发消息到子线程 * * * 其实这些线程间发送消息,没有什么;关键还是在于构造Handler时传入谁的Looper. * */public class MainActivity extends Activity {private TextView mTextView;private HandlerTest1 mHandlerTest1;private HandlerTest2 mHandlerTest2;private int counter=0;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);init();}private void init() {mTextView = (TextView) findViewById(R.id.textView);//1 子线程发送消息给本身new Thread() {public void run() {Looper.prepare();mHandlerTest1=new HandlerTest1(Looper.myLooper());Message message = new Message();message.obj = "子线程发送的消息Hi~Hi";mHandlerTest1.sendMessage(message);Looper.loop();};}.start();}private class HandlerTest1 extends Handler {private HandlerTest1(Looper looper) {super(looper);}@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);System.out.println("子线程收到:" + msg.obj);//2 收到消息后可再发消息到主线程mHandlerTest2=new HandlerTest2(getMainLooper());Message message = new Message();message.obj = "O(∩_∩)O";mHandlerTest2.sendMessage(message);}}private class HandlerTest2 extends Handler {private HandlerTest2(Looper looper) {super(looper);}@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);mTextView.setText("在主线程中,收到子线程发来消息:" + msg.obj);//3 收到消息后再发消息到子线程if (counter==0) {Message message = new Message();message.obj = "主线程发送的消息Xi~Xi";mHandlerTest1.sendMessage(message);counter++;}}}}
main.xml如下:
<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" > <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" android:layout_centerInParent="true" android:layout_marginTop="70dip" /> </RelativeLayout>
对于Android Handler与Message的多线程消息的处理,为什我以下代码会死掉? 看看,
1.线程没有终止条件,会一直给主线程发消息,主线程不停的调用handleMessage代码,很容易ANR(应用程序不响应)
2.handler.obtainMessage()得到message对象比new Message();更高效
Android Handler机制 怎使用?
在主线程中,可以直接使用new Handler()创建Handler对象,其将自动与主线程的Looper对象绑定;在非主线程中直接这样创建Handler则会报错,因为Android系统默认情况下非主线程中没有开启Looper,而Handler对象必须绑定Looper对象。这种情况下,需先在该线程中手动开启Looper(Looper.prepare()-->Looper.loop()),然后将其绑定到Handler对象上;或者通过Looper.getMainLooper(),获得主线程的Looper,将其绑定到此Handler对象上。
Handler发送的消息都会加入到Looper的MessageQueue中。一说Handler包含两个队列:线程队列和消息队列;使用Handler.post()可以将线程对象加入到线程队列中;使用Handler.sendMessage()可以将消息对象加入到消息队列中。通过源码分析证实,Handler只有一个消息队列,即MessageQueue。通过post()传进去的线程对象将会被封装成消息对象后传入MessageQueue。
使用post()将线程对象放到消息队列中后,当Looper轮询到该线程执行时,实际上并不会单独开启一个新线程,而仍然在当前Looper绑定的线程中执行,Handler只是调用了该线程对象的run()而已。如,在子线程中定义了更新UI的指令,若直接开启将该线程执行,则会报错;而通过post()将其加入到主线程的Looper中并执行,就可以实现UI的更新。
使用sendMessage()将消息对象加入到消息队列后,当Looper轮询到该消息时,就会调用Handler的handleMessage()来对其进行处理。再以更新UI为例,使用这种方法的话,就先将主线程的Looper绑定在Handler对象上,重载handleMessage()来处理UI更新,然后向其发送消息就可以了。
1 0
- Handler详解系列——利用Handler在主线程与子线程之间互发消息,handler详解
- Handler详解系列(四)——利用Handler在主线程与子线程之间互发消息,handler详解
- Handler详解系列(四)——利用Handler在主线程与子线程之间互发消息
- 利用Handler在主线程与子线程之间互发消息,handler详解
- 利用Handler在主线程与子线程之间互发消息
- Handler详解系列(三)——在子线程中给主线程的消息队列发送消息
- Handler详解系列(二)——主线程向自身消息队列发消息
- Android Handler:子线程发消息到UI主线程
- handler 主线程与子线程之间的通信
- 使用Handler实现主线程与子线程之间互相传递消息
- 子线程发消息到主线程进行更新 UI,除了 handler 和 AsyncTask,还有什么?
- Android 使用handler实现线程间发送消息 (主线程 与 子线程之间)、(子线程 与 子线程之间)
- Android使用Handler实现子线程与子线程、主线程之间通信
- Handler从主线程向子线程发送消息
- Handler(3)--在子线程中主线程的 消息队列发送消息
- 工作线程中利用handler向主线程发送消息
- Android之Handler(主线程,自己线程,其他线程互发消息)
- Android中Handler从子线程发消息到主线程回调消息全过程
- 程序使用微软雅黑作为默认字体在xp下的问题
- 2015 Objective-C 三大新特性 不可错过的iOS开发技巧
- hdoj2084 数塔
- windows后台服务如何部署到Linux
- Mac 下配置ionic
- Handler详解系列——利用Handler在主线程与子线程之间互发消息,handler详解
- iOS 中的数据持久化2.0-bruceyou1990
- Android笔记之如何获取屏幕宽高
- JavaScript Array模拟C#list RemoveAll实现删除符合条件的元素
- Java8 Lambda表达式教程
- JVM调优总结:一些概念
- 写在参观百度之前:
- PB下使用TreeView控件实现多级分类检索
- iOS APP提交上架最新流程