Android中Handler与Message的基础应用(子线程中更新UI)

零、

零点1、写在前面

在Android中,关于UI的管理是在主线程中进行的。但咱们常常遇到须要在子线程中更新UI的状况,因此可使用Handler与Message来完成。ide

1、Handler与Message

Handler在主线程中,负责处理消息,Message能够在子线程中发送消息。因此子线程中更新UI的思路就是:在子线程中发送Message,由Handler接受处理,而Handler在主线程中,因此能够更新UI。this

2、设置Handler

两种方法:一、实例化一个Handler对象并重载handleMessage方法。二、定义本身的Handler类继承自Handler并重写handleMessage方法。spa

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中写下这段代码,会报一个警告,咱们以后再说翻译

3、经过Message发送消息

在须要发送消息的地方咱们实例化Message对象并设置好参数就能够发送了。code

Code警告cdn

Message mes = new Message();
mes.what = 0;
mes.obj = text;//text就是你想要传递的参数
handler.sendMessage(mes);
复制代码

Message中还有其余实用的方法,例如void setData(Bundle data),能够在message中传递bundle,能够说是很负责了。对象

4、还记得关于Handler的警告么?

//警告虽然能够忽略,可是可能会形成意想不到的后果。但愿你们之后也要注意处理一下警告。blog

首先咱们来看一下警告的内容排序

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开发的初学者,若是我有错误的地方或者不足的话欢迎你们指正。

相关文章
相关标签/搜索