Handler消息传递机制(一)

来源:互联网 发布:火炮兰捏脸数据2016 编辑:程序博客网 时间:2024/04/28 12:45

MessageQueue:Looper负责管理。采用先进先出的方式管理Message.

Looper:每个线程只有一个Looper,负责管理MessageQueue,会不断从MessageQueue中取出消息,并将消息分给对应的Handler处理

Handler:能把消息发送给Looper管理的MessageQueue,并负责处理Looper分给它的消息(在新启动的线程中发送消息;在主线程中获取、处理消息)


声明访问网络权限

<uses-permission android:name="android.permission.INTERNET"/>

package com.example.handler;import java.io.IOException;import org.apache.http.HttpResponse;import org.apache.http.client.ClientProtocolException;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.util.EntityUtils;import android.app.Activity;import android.app.ProgressDialog;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.ImageView;public class MainActivity extends Activity {private Button button;private ImageView imageView;private String image_path = "http://pic4.nipic.com/20090828/2366808_092035042961_2.jpg";public final int IS_FINISH = 1;private ProgressDialog dialog = null;private Handler handler = new Handler(){public void handleMessage(Message msg){byte[] data = (byte[]) msg.obj;Bitmap bm = BitmapFactory.decodeByteArray(data, 0, data.length);imageView.setImageBitmap(bm);if(msg.what == IS_FINISH){dialog.dismiss();}}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);button = (Button) findViewById(R.id.button1);imageView = (ImageView) findViewById(R.id.imageView1);dialog = new ProgressDialog(this);dialog.setTitle("提示");dialog.setMessage("正在下载,请稍后...");button.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubnew Thread(new MyThread()).start();dialog.show();}});}public class MyThread implements Runnable{@Overridepublic void run() {// TODO Auto-generated method stubHttpClient httpClient = new DefaultHttpClient();HttpGet httpGet = new HttpGet(image_path);try {HttpResponse httpResponse = httpClient.execute(httpGet);if(httpResponse.getStatusLine().getStatusCode() == 200){byte[] data = EntityUtils.toByteArray(httpResponse.getEntity());/* * 建议用Message.obtain()而不是new一个Message;会先从消息池中获取 * 一个Message以便重复利用,消息池里没有才会new一个Message */Message msg = Message.obtain();//可传两个整形、一个对象过去,字节数组也是一个对象msg.obj = data;msg.what = IS_FINISH;handler.sendMessage(msg);}} catch (ClientProtocolException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}

0 0
原创粉丝点击