标签:
andriod提供了Handler 和 Looper 来满足线程间的通信。Handler先进先出原则。Looper类用来管理特定线程内对象之间的消息交换(MessageExchange)。
4)线程:UIthread 通常就是main thread,而Android启动程序时会替它建立一个MessageQueue。
2.Handler发送消息
UI主线程初始化第一个Handler时会通过ThreadLocal创建一个Looper,该Looper与UI主线程一一对应。使用ThreadLocal的目的是保证每一个线程只创建唯一一个Looper。之后其他Handler初始化的时候直接获取第一个Handler创建的Looper。Looper初始化的时候会创建一个消息队列MessageQueue。至此,主线程、消息循环、消息队列之间的关系是1:1:1。
Handler、Looper、MessageQueue的初始化流程如图所示:
3.Handler处理消息
UI主线程通过Looper循环查询消息队列UI_MQ,当发现有消息存在时会将消息从消息队列中取出。首先分析消息,通过消息的参数判断该消息对应的Handler,然后将消息分发到指定的Handler进行处理。
子线程通过Handler、Looper与UI主线程通信的流程如图所示。
下面是一个模拟进度条:
MainActivity:
package com.neusoft.test; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.app.Activity; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ProgressBar; public class MainActivity extends Activity { private ProgressBar pb=null; private Button bt=null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity); pb=(ProgressBar) findViewById(R.id.pb); bt=(Button) findViewById(R.id.bt); bt.setOnClickListener(new MyButton()); } class MyButton implements OnClickListener { public void onClick(View arg0) { handler.post(update); } } Handler handler=new Handler(){ public void handleMessage(Message msg) { pb.setProgress(msg.arg1); handler.post(update); } }; Runnable update=new Runnable() { int i=0; @Override public void run() { i+=10; Message msg=handler.obtainMessage(); msg.arg1=i; try { Thread.sleep(1000); } catch (Exception e) { e.printStackTrace(); } if(i<=100) { handler.sendMessage(msg); } else{ handler.removeCallbacks(update); } } }; }
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ProgressBar android:id="@+id/pb" style="?android:attr/progressBarStyleHorizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" android:max="100" /> <Button android:id="@+id/bt" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="开始" /> </LinearLayout>
标签:
原文地址:http://blog.csdn.net/zyx520ytt/article/details/51334621