您的位置:首页 > 其它

Handler消息传递机制(一)

2015-01-29 16:32 176 查看
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();
}
}
};
@Override
protected 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() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
new Thread(new MyThread()).start();
dialog.show();
}
});
}
public class MyThread implements Runnable{

@Override
public void run() {
// TODO Auto-generated method stub
HttpClient 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 block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}
}



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: