网站 域名 授权服务器 分布式,seo团队,新手做地方门户网站,成都旅游地图andriod提供了Handler 和 Looper 来满足线程间的通信。Handler先进先出原则。Looper类用来管理特定线程内对象之间的消息交换(MessageExchange)。1)Looper: 一个线程可以产生一个Looper对象#xff0c;由它来管理此线程里的MessageQueue(消息队列)。 2)Handler: 你可以构造Han… andriod提供了Handler 和 Looper 来满足线程间的通信。Handler先进先出原则。Looper类用来管理特定线程内对象之间的消息交换(MessageExchange)。1)Looper: 一个线程可以产生一个Looper对象由它来管理此线程里的MessageQueue(消息队列)。 2)Handler: 你可以构造Handler对象来与Looper沟通以便push新消息到MessageQueue里;或者接收Looper从Message Queue取出)所送来的消息。3) Message Queue(消息队列):用来存放线程放入的消息。 4)线程UIthread 通常就是main thread而Android启动程序时会替它建立一个MessageQueue。 1.Handler创建消息 每一个消息都需要被指定的Handler处理通过Handler创建消息便可以完成此功能。Android消息机制中引入了消息池。Handler创建消息时首先查询消息池中是否有消息存在如果有直接从消息池中取得如果没有则重新初始化一个消息实例。使用消息池的好处是消息不被使用时并不作为垃圾回收而是放入消息池可供下次Handler创建消息时使用。消息池提高了消息对象的复用减少系统垃圾回收的次数。消息的创建流程如图所示。 2.Handler发送消息 UI主线程初始化第一个Handler时会通过ThreadLocal创建一个Looper该Looper与UI主线程一一对应。使用ThreadLocal的目的是保证每一个线程只创建唯一一个Looper。之后其他Handler初始化的时候直接获取第一个Handler创建的Looper。Looper初始化的时候会创建一个消息队列MessageQueue。至此主线程、消息循环、消息队列之间的关系是1:1:1。 Handler、Looper、MessageQueue的初始化流程如图所示: Hander持有对UI主线程消息队列MessageQueue和消息循环Looper的引用子线程可以通过Handler将消息发送到UI线程的消息队列MessageQueue中。3.Handler处理消息 UI主线程通过Looper循环查询消息队列UI_MQ当发现有消息存在时会将消息从消息队列中取出。首先分析消息通过消息的参数判断该消息对应的Handler然后将消息分发到指定的Handler进行处理。 子线程通过Handler、Looper与UI主线程通信的流程如图所示。 一、Handler的定义: 主要接受子线程发送的数据, 并用此数据配合主线程更新UI. 解释: 当应用程序启动时Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件进行事件分发, 比如说, 你要是点击一个 Button, Android会分发事件到Button上来响应你的操作。 如果此时需要一个耗时的操作例如: 联网读取数据或者读取本地较大的一个文件的时候你不能把这些操作放在主线程中如果你放在主线程中的话界面会出现假死现象, 如果5秒钟还没有完成的话会收到Android系统的一个错误提示 强制关闭. 这个时候我们需要把这些耗时的操作放在一个子线程中,因为子线程涉及到UI更新Android主线程是线程不安全的也就是说更新UI只能在主线程中更新子线程中操作是危险的. 这个时候Handler就出现了来解决这个复杂的问题由于Handler运行在主线程中(UI线程中)它与子线程可以通过Message对象来传递数据这个时候Handler就承担着接受子线程传过来的(子线程用sedMessage()方法传弟)Message对象(里面包含数据) , 把这些消息放入主线程队列中配合主线程进行更新UI。 二、Handler一些特点 handler可以分发Message对象和Runnable对象到主线程中, 每个Handler实例,都会绑定到创建他的线程中(一般是位于主线程), 它有两个作用: (1): 安排消息或Runnable 在某个主线程中某个地方执行, (2)安排一个动作在不同的线程中执行 Handler中分发消息的一些方法 post(Runnable) postAtTime(Runnable,long) postDelayed(Runnable long) sendEmptyMessage(int) sendMessage(Message) sendMessageAtTime(Message,long) sendMessageDelayed(Message,long) 以上post类方法允许你排列一个Runnable对象到主线程队列中, sendMessage类方法, 允许你安排一个带数据的Message对象到队列中等待更新.三、Handler实例 (1) 子类需要继承Handler类并重写handleMessage(Message msg) 方法, 用于接受线程数据 以下为一个实例它实现的功能为 : 通过线程修改界面Button的内容 1 public class MyHandlerActivity extends Activity { 2 Button button; 3 MyHandler myHandler; 4 5 protected void onCreate(Bundle savedInstanceState) { 6 super.onCreate(savedInstanceState); 7 setContentView(R.layout.handlertest); 8 9 button (Button) findViewById(R.id.button);10 myHandler new MyHandler();11 // 当创建一个新的Handler实例时, 它会绑定到当前线程和消息的队列中,开始分发数据12 // Handler有两个作用, (1) : 定时执行Message和Runnalbe 对象13 // (2): 让一个动作,在不同的线程中执行.14 15 // 它安排消息,用以下方法16 // post(Runnable)17 // postAtTime(Runnable,long)18 // postDelayed(Runnable,long)19 // sendEmptyMessage(int)20 // sendMessage(Message);21 // sendMessageAtTime(Message,long)22 // sendMessageDelayed(Message,long)23 24 // 以上方法以 post开头的允许你处理Runnable对象25 //sendMessage()允许你处理Message对象(Message里可以包含数据,)26 27 MyThread m new MyThread();28 new Thread(m).start();29 }30 31 /**32 * 接受消息,处理消息 ,此Handler会与当前主线程一块运行33 * */34 35 class MyHandler extends Handler {36 public MyHandler() {37 }38 39 public MyHandler(Looper L) {40 super(L);41 }42 43 // 子类必须重写此方法,接受数据44 Override45 public void handleMessage(Message msg) {46 // TODO Auto-generated method stub47 Log.d(MyHandler, handleMessage......);48 super.handleMessage(msg);49 // 此处可以更新UI50 Bundle b msg.getData();51 String color b.getString(color);52 MyHandlerActivity.this.button.append(color);53 54 }55 }56 57 class MyThread implements Runnable {58 public void run() {59 60 try {61 Thread.sleep(10000);62 } catch (InterruptedException e) {63 // TODO Auto-generated catch block64 e.printStackTrace();65 }66 67 Log.d(thread......., mThread........);68 Message msg new Message();69 Bundle b new Bundle();// 存放数据70 b.putString(color, 我的);71 msg.setData(b);72 73 MyHandlerActivity.this.myHandler.sendMessage(msg); // 向Handler发送消息,更新UI,用sendMessage“消息”来传递消息74 75 }76 }77 78 } 转载于:https://www.cnblogs.com/wangmars/p/3239509.html