Handler、Looper、MessageQueue、Message

来源:互联网 发布:数据监控的技术方案 编辑:程序博客网 时间:2024/05/17 03:14
1.什么是handler : 是Android提供用来更新UI线程的一套机制,也是一套消息处理机制,可以发送消息,也可以处理消息。
     在handlerMessage()方法中处理UI

     发送的消息遵循先进先出原则


2.Message:
   arg1、arg2:均为整形数据,用来传输一些整形,如更新进度条。
   obj:一个Object对象

    what:标记数,用户定义的消息代码,以便识别是哪一个Message


3.Looper:
在Activity中有一个默认的Looper对象来处理子线程中发送的消息
一个线程只能产生一个Looper对象


Looper Handler Message MessageQueue之间的关系:
Handler:封装了消息的发送和接收处理
Looper:内部包含一个消息队列MessageQueue,所有的Handler发送的消息都走向这个消息队列。Lopper.loop()方法就是一个死循环,不断的从MessageQueue对象取消息,如有消息就处理,没有消息就阻塞。
MessageQueue:一个消息队列,由Message构成。可以添加消息,并处理消息

总结:Handler负责发送Message,Looper负责接收Handler发送的消息,并直接传回给Handler自己,而MessageQueue就是一个存储消息的容器



一个通过handler和http读取网页上图片的例子

public class MainActivity extends Activity {Button button;ImageView imageView;String uri="http://pic1.nipic.com/2008-12-12/20081212153724720_2.jpg";private ProgressDialog dialog=null;Handler handler=new Handler(){public void handleMessage(android.os.Message msg) {byte[]data=(byte[]) msg.obj;Bitmap bitmap=BitmapFactory.decodeByteArray(data, 0, data.length);imageView.setImageBitmap(bitmap);if (msg.what==1) {//当接收到what时  说明已经传完  dialog.dismiss();}};};public class MyThread implements Runnable{@Overridepublic void run() {// TODO Auto-generated method stubHttpClient httpClient=new DefaultHttpClient();HttpGet httpGet=new HttpGet(uri);HttpResponse httpResponse=null;try {httpResponse=httpClient.execute(httpGet);if (httpResponse.getStatusLine().getStatusCode()==200) {byte[]data=EntityUtils.toByteArray(httpResponse.getEntity());Message message=Message.obtain();message.obj=data;message.what=1;handler.sendMessage(message);}} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}}}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);button=(Button)findViewById(R.id.button);imageView=(ImageView)findViewById(R.id.image);dialog=new ProgressDialog(this);dialog.setTitle("提示");dialog.setMessage("正在下载,请稍后···");dialog.setCancelable(false);button.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubnew Thread(new MyThread()).start();dialog.show();}});}}


运行结果:





0 0
原创粉丝点击