消息队列机制messageQuene
2015-11-01 15:57
507 查看
主线程在创建的同时会创建两个对象消息队列对象(messageQuene)和轮询器对象(Looper)。
轮询器的作用就是当消息队列有新的消息的时候会通知消息处理器(Handler),这个对象需要我们自己创建,
消息处理器就会调用hangdleMessage来出来这条消息,因为这个方法运行在主线程,所以可以更新ui。
总的来说就是一句话,当消息队列里有新消息时候,hangdleMessage这个方法就会被调用,
子线程如果想更新ui就可以给消息队列发送消息;
在android4.0之后一些耗时的操作不能放在主线程,比如链接网络,下载等等.
这时候我们可以放在一个子线程来做这件事,但是子线程无法更新ui界面
一般时候message不会直接new出来,而是通过handler.obtainMessage();来进行创建
msg可以用what传递参数为了判断是谁发送的msg
轮询器的作用就是当消息队列有新的消息的时候会通知消息处理器(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(); } }); } }
相关文章推荐
- queue的用法
- requirejs项目部署
- required定义
- OC 学习笔记4 NSSet NSMutableSet NSDictionary NSMutableDictionary NSNumber NSValue
- [Chromium官方博客文章转载]Jank Busters Part One(UI Jank指的是界面来不及刷新导致的卡塞空白现象?
- ros_fuerte创建工作空间、创建ROS功能包、编译ROS功能包、创建节点(cpp)、编译节点、使用launch文件、创建srv和msg文件、使用新建的srv和msg文件
- new Integer(text).intValue()的用法
- InterView common question
- ios学习之苹果官方文档的学习(UIFocusUpdateContext方面)
- hadoop 之 InputFormat类 --- KeyValueTextInputFormat 实例
- Codeforces Round #328 (Div. 2) B. The Monster and the Squirrel 打表数学
- InputSplit—>RecordReder—>map(key,value,context)的过程解析
- POJ 1947 Rebuilding Roads(树形DP)
- NGUI简单的UI功能操作
- IOS-UITableView上的纯代码实现
- cf#328-B. The Monster and the Squirrel-水题+数学规律
- HDU 5531 Rebuild 相切的圆们
- EasyUI - DataGrid 组建 - [ 样式功能 ]
- handler更新UI主线程
- uestcoj Huatuo's Medicine 1226 (简单题)