零、
零点一、写在前面
在Android中,关于UI的管理是在主线程中进行的。但我们经常遇到需要在子线程中更新UI的情况,所以可以使用Handler与Message来完成。
一、Handler与Message
Handler在主线程中,负责处理消息,Message可以在子线程中发送消息。所以子线程中更新UI的思路就是:在子线程中发送Message,由Handler接受处理,而Handler在主线程中,所以可以更新UI。
二、设置Handler
两种方法:1、实例化一个Handler对象并重载handleMessage方法。2、定义自己的Handler类继承自Handler并重写handleMessage方法。
Show me the code
private Handler mHandler = new Handler(){
public void handleMessag(Message mes){
super.handleMessage(mes);
//这里做你想做,为所欲为
switch(mes.what){//我在这里通过判断mes的类型做不同的操作。
case 0:{
String text = (String) mes.obj;
Toast.makeText(MainActivity.this,text,Toast.LENGTH_LONG);break;
}
default:break;
}
}
};
复制代码
当然,你在Android Studio中写下这段代码,会报一个警告,我们之后再说
三、通过Message发送消息
在需要发送消息的地方我们实例化Message对象并设置好参数就可以发送了。
Code警告
Message mes = new Message();
mes.what = 0;
mes.obj = text;//text就是你想要传递的参数
handler.sendMessage(mes);
复制代码
Message中还有其他实用的方法,例如void setData(Bundle data),可以在message中传递bundle,可以说是很负责了。
四、还记得关于Handler的警告么?
//警告虽然可以忽略,但是可能会造成意想不到的后果。希望大家以后也要注意处理一下警告。
首先我们来看一下警告的内容
This Handler class should be static or leaks might occur
之后还有具体的警告信息。总之这条警告的大概意思是:由于这个Handler class 被声明为内部类,所以可能会引起内存泄漏,应该声明为static。
关于内存泄漏的解释,我用萌新语翻译一下就是:我们这么写,将来内存泄漏出现偏差,我们要负责任的。嗯..其实这样说的,Handler在主线程中,我们要是想退出MainActivity,但是Handler万一还在等着消息呢,Android又不忍心伤害一个在家中苦苦等待自己在外工作的老公的Handler的心,所以说MainActivity我去买几个橘子,你就在内存中等罢不要onDestroy。后果呢,就是可能内存泄漏了。
但其实关于这个警告,Android Framework 的工程师 Romain Guy早已经给出了自己的建议写法。我们来看看:
private static class MyHandler extends Handler{
private final WeakReference<MainActivity> mActicity;
public MyHandler(MainActivity activity){
mActicity = new WeakReference<MainActivity>(activity);
}
@Override
public void handleMessage(Message mes){
super.handleMessage(mes);
MainActivity activity = mActicity.get();
if(activity != null){
switch (mes.what){
case 0:
String text = (String) mes.obj;
Toast.makeText(MainActivity.this,text,Toast.LENGTH_LONG);break;
default:break;
}
}
}
}
复制代码
官方解决,O了个冒泡排序K。
//作为Android开发的初学者,如果我有错误的地方或者不足的话欢迎大家指正。