1.什么是handler : 是Android提供用来更新UI线程的一套机制,也是一套消息处理机制,可以发送消息,也可以处理消息。
在handlerMessage()方法中处理UI
arg1、arg2:均为整形数据,用来传输一些整形,如更新进度条。
obj:一个Object对象
在Activity中有一个默认的Looper对象来处理子线程中发送的消息
一个线程只能产生一个Looper对象
Looper Handler Message MessageQueue之间的关系:
Handler:封装了消息的发送和接收处理
Looper:内部包含一个消息队列MessageQueue,所有的Handler发送的消息都走向这个消息队列。Lopper.loop()方法就是一个死循环,不断的从MessageQueue对象取消息,如有消息就处理,没有消息就阻塞。
MessageQueue:一个消息队列,由Message构成。可以添加消息,并处理消息
总结:Handler负责发送Message,Looper负责接收Handler发送的消息,并直接传回给Handler自己,而MessageQueue就是一个存储消息的容器
在handlerMessage()方法中处理UI
发送的消息遵循先进先出原则
arg1、arg2:均为整形数据,用来传输一些整形,如更新进度条。
obj:一个Object对象
what:标记数,用户定义的消息代码,以便识别是哪一个Message
在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{
@Override
public void run() {
// TODO Auto-generated method stub
HttpClient 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 exception
e.printStackTrace();
}
}
}
@Override
protected 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() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
new Thread(new MyThread()).start();
dialog.show();
}
});
}
}