产生原因、用处:
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集,安卓消息机制入门