在 Android 中,关于 UI 的管理是在主线程中进行的。但我们经常遇到需要在子线程中更新 UI 的情况,所以可以使用 Handler 与 Message 来完成。
Handler 在主线程中,负责处理消息,Message 可以在子线程中发送消息。所以子线程中更新 UI 的思路就是:在子线程中发送 Message,由 Handler 接受处理,而 Handler 在主线程中,所以可以更新 UI。
两种方法:1、实例化一个 Handler 对象并重载 handleMessage 方法。2、定义自己的 Handler 类继承自 Handler 并重写 handleMessage 方法。
- 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 mes = new Message();
- mes.what = 0;
- mes.obj = text; //text就是你想要传递的参数
- handler.sendMessage(mes);
Message 中还有其他实用的方法,例如 void setData(Bundle data),可以在 message 中传递 bundle,可以说是很负责了。
// 警告虽然可以忽略,但是可能会造成意想不到的后果。希望大家以后也要注意处理一下警告。
首先我们来看一下警告的内容
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 开发的初学者,如果我有错误的地方或者不足的话欢迎大家指正。
来源: https://juejin.im/post/5a2f9fe46fb9a0450407d98b