android 消息机制

来源:互联网 发布:stm8 c语言编程 编辑:程序博客网 时间:2024/05/02 04:47

产生原因、用处:


1.安卓4.0以上系统,不能在主线程更新UI。

2.耗时较长的操作,如遍历、长文本处理、从网路获取数据(网路操作)。

3.解决的相关异常:CalledFromWrongThreadException

4.由于需要进行类似于步骤2的操作比较多,如果一步步的来,需要代码不停地嵌套,所以使用handler,使程序结构严谨。


用法:


1.由于一些操作耗时过长(遍历、长文本处理、网络操作),所以我们通常把他们放在子线程处理,这样就不会让主线程卡死、假死。

   所以我们先在耗时较长的地方创建子线程


   new Thead(){

public void run(){//这里面就是子线程处理操作的地方


//现在这里做一些耗时很长的动作



Message msg = new Message();//创建一个message对象,用于储存你要传递给主线程的数据,也就是要发送给主线程的"消息"

msg.what=CHANGE_UI;

//CHANGE_UI是一个int类型的常量,表示一个标示,用于告诉主线程的handler,我发送的消息叫什么名字,就是你拿到这个消息要知道我想让你干嘛

msg.obj="我是被传递的字符串";


handler.sendMessage(msg);//把消息打包发送给主线程

}


   }.start();



1.主线程创建Handler,用于处理子线程刚才发送过来消息。


private Handler handler = new Handler(){

public void handleMessage(android.os.Messager msg){

         //这是一个回调函数,一旦有子线程向主线程发送消息,Handler对象就会调用这个方法,来处理子线程发过来的消息


if(msg.what == CHANGE_UI){//判断子线程发送过来的消息类型,这个msg.what的what的含义就是消息的类型,在子线程发送消息的时候要设置的。


String text = (String) msg.obj;//获取子线程传递过来的数据,因为你要更新UI,那么到底更新什么呢?这里就是一个获取数据的


//更新对应的UI,比如打印一个Toast.

Toast.makeText("MainActivity.this","我打印了一个Toast,我更新了UI,我把子线程传递过来的text获取了:"+text,1).show();


}

}

};


看不懂的可以看视频教程:http://pan.baidu.com/s/1eQj8NHC  这里面的第51集,安卓消息机制入门

0 0