码迷,mamicode.com
首页 > 移动开发 > 详细

随感一:android handler传值更改ui

时间:2016-01-07 18:09:15      阅读:221      评论:0      收藏:0      [点我收藏+]

标签:

   handler+looper传值更改activity的UI

                        博客开了一段时间,一直想写点自己的学习经验及体会,等着以后长时间不用再要用到的时候直接拿过来上手。想了想,之前用到handler,

                 看了几篇文章感觉不是很详细。今天就来讲讲handler。

                         android用handler传值更改UI有两个目的:一、从用户体验方面考虑,把繁杂的操作和计算过程放到其他线程,是主线程(用户界面)更

                                                                                          加的流畅,减少出现卡顿现象。

                                                                                   二、确保线程安全,只有主线程能更改UI;

                        利用handler传值,需要创建looper对象(系统在创建主线程(activity)的时候,在activity内部封装了一个looper对象,即看不到新建

                  looper对象),系统会为每个looper创建an一个消息队(messagequene),通过handler的sendmessage方法发送消息给该looper的消息

                  队列,然后在该线程中,handler会从消息队列中取出message,通过message.what来判断接收的message进行什么操作(更改该线程的ui等)。

                  如果你想在其他的线程里面进行操作之后发message给UI线程改变UI,就必须要确保你的handler发送的消息必须发送到该UI线程的消息队列(messagequene),

                  最简单的办法就是使用UI线程的handler进行发送message(即sendmessage),下面说两种方法使操作的线程获得UI线程的handler:

                                 一、在操作线程中:Handler  handler=MainActivity.handler;如果你要更改UI,就要在MainActivity里面

                                        定义一个handler属性并且要是静态的(static),这样把handler的实例化最好放在oncreact方法里面

                                        (当然,handler实例化可以放在类里面的任何地方),在handler的实例化对象里面重写 handleMessage(Message msg)

                                         方法,在handleMessage方法里面进行接收消息并进行操作改变UI。      

                                   二、定义一个有handler属性的类,在类里面添加get和set方法用来获取和实例化handler;

下面看代码吧:

UI线程

public class MainActivity extends DroidGap {

public static Handler handler;

@Override
public void onCreate(Bundle savedInstanceState) {
// Be sure to call the super class.
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
handler = new Handler() {

@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what == 100) {
//这里面写代码更改UI
} else if (msg.what == 101) {
//这里面写代码更改UI
} else if (msg.what == 102) {

}

}

 

 

 

操作类:

public boolean add(JSONArray json) {
try {
JSONArray jsonArray=json.getJSONArray(0);
JSONObject jsonObject= (JSONObject) (jsonArray.get(0));
final PrintItem printItem=new PrintItem(jsonObject.getString("product"),jsonObject.getInt("count"),jsonObject.getInt("price"));
list.add(printItem);
handler=MainActivity.handler;
Message message=new Message();
message.what=100;
message.obj=printItem;
handler.sendMessage(message);
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}

 

 

随感一:android handler传值更改ui

标签:

原文地址:http://www.cnblogs.com/iverson-weng/p/5110567.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!