您的位置:首页 > 产品设计 > UI/UE

消息队列机制messageQuene

2015-11-01 15:57 507 查看
主线程在创建的同时会创建两个对象消息队列对象(messageQuene)和轮询器对象(Looper)。

轮询器的作用就是当消息队列有新的消息的时候会通知消息处理器(Handler),这个对象需要我们自己创建,

消息处理器就会调用hangdleMessage来出来这条消息,因为这个方法运行在主线程,所以可以更新ui。

总的来说就是一句话,当消息队列里有新消息时候,hangdleMessage这个方法就会被调用,

子线程如果想更新ui就可以给消息队列发送消息;

在android4.0之后一些耗时的操作不能放在主线程,比如链接网络,下载等等.

这时候我们可以放在一个子线程来做这件事,但是子线程无法更新ui界面

packagecom.example.getimg;

importandroid.app.Activity;
importandroid.graphics.Bitmap;
importandroid.graphics.BitmapFactory;

importandroid.os.Bundle;
importandroid.os.Message;
importandroid.view.View;
importandroid.widget.ImageView;
importandroid.widget.Toast;

importjava.io.InputStream;
importjava.net.HttpURLConnection;

importjava.net.URL;

publicclassMyActivityextendsActivity{
/**
*Calledwhentheactivityisfirstcreated.
*/
android.os.Handlerhandler=newandroid.os.Handler(){
//用handlemessage来更新ui线程
@Override
publicvoidhandleMessage(Messagemsg){
switch(msg.what){
case0:
ImageViewimg=(ImageView)findViewById(R.id.img);
img.setImageBitmap((Bitmap)msg.obj);
break;
case1:
Toast.makeText(MyActivity.this,"没有响应",Toast.LENGTH_SHORT).show();
break;
}

}
};
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

findViewById(R.id.btn).setOnClickListener(newView.OnClickListener(){
@Override
publicvoidonClick(Viewview){
//创建子线程来链接网络,并且使用get方法下载图片
Threadthread=newThread(){
@Override
publicvoidrun(){
{
Stringpath="http://192.168.21.1:8080/ok/point_one2.png";
//uri
try{
URLurl=newURL(path);
//获得链接
HttpURLConnectionconn=(HttpURLConnection)url.openConnection();
//设置参数
conn.setRequestMethod("GET");
conn.setConnectTimeout(5000);
conn.setReadTimeout(5000);
//正式链接
conn.connect();
if(conn.getResponseCode()==200){
InputStreamis=conn.getInputStream();
//把InputStream通过bitmap转化成图片
Bitmapbitmap=BitmapFactory.decodeStream(is);
//创建消息对象
Messagemsg=newMessage();
msg.what=0;
//传递bitmap所需要的数据,如果是多个数据可以传递数组啊!
msg.obj=bitmap;
//给消息队列发送消息
handler.sendMessage(msg);

}else{
//一般不会new,这样会节省内存
Messagemsg=handler.obtainMessage();
//传递参数为了判断是谁发送的message
msg.what=1;
handler.sendMessage(msg);
//Toast.makeText(MyActivity.this,"没有响应",Toast.LENGTH_SHORT).show();
}

}catch(Exceptione){
e.printStackTrace();
}
}
}

};
thread.start();
}
});
}
}


一般时候message不会直接new出来,而是通过handler.obtainMessage();来进行创建

msg可以用what传递参数为了判断是谁发送的msg



packagecom.example.getimg;

importandroid.app.Activity;
importandroid.graphics.Bitmap;
importandroid.graphics.BitmapFactory;

importandroid.os.Bundle;
importandroid.os.Message;
importandroid.view.View;
importandroid.widget.ImageView;
importandroid.widget.Toast;

importjava.io.InputStream;
importjava.net.HttpURLConnection;

importjava.net.URL;

publicclassMyActivityextendsActivity{
/**
*Calledwhentheactivityisfirstcreated.
*/
android.os.Handlerhandler=newandroid.os.Handler(){
//用handlemessage来更新ui线程
@Override
publicvoidhandleMessage(Messagemsg){
switch(msg.what){
case0:
ImageViewimg=(ImageView)findViewById(R.id.img);
img.setImageBitmap((Bitmap)msg.obj);
break;
case1:
Toast.makeText(MyActivity.this,"没有响应",Toast.LENGTH_SHORT).show();
break;
}

}
};
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

findViewById(R.id.btn).setOnClickListener(newView.OnClickListener(){
@Override
publicvoidonClick(Viewview){
//创建子线程来链接网络,并且使用get方法下载图片
Threadthread=newThread(){
@Override
publicvoidrun(){
{
Stringpath="http://192.168.21.1:8080/ok/point_one2.png";
//uri
try{
URLurl=newURL(path);
//获得链接
HttpURLConnectionconn=(HttpURLConnection)url.openConnection();
//设置参数
conn.setRequestMethod("GET");
conn.setConnectTimeout(5000);
conn.setReadTimeout(5000);
//正式链接
conn.connect();
if(conn.getResponseCode()==200){
InputStreamis=conn.getInputStream();
//把InputStream通过bitmap转化成图片
Bitmapbitmap=BitmapFactory.decodeStream(is);
//创建消息对象
Messagemsg=newMessage();
msg.what=0;
//传递bitmap所需要的数据,如果是多个数据可以传递数组啊!
msg.obj=bitmap;
//给消息队列发送消息
handler.sendMessage(msg);

}else{
//一般不会new,这样会节省内存
Messagemsg=handler.obtainMessage();
//传递参数为了判断是谁发送的message
msg.what=1;
handler.sendMessage(msg);
//Toast.makeText(MyActivity.this,"没有响应",Toast.LENGTH_SHORT).show();
}

}catch(Exceptione){
e.printStackTrace();
}
}
}

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