Android更新UI的四种方式

前言

     相信初学Android开发的朋友来说,应该都会遇到一个问题,我们开启了一个线程,在这个线程里面我们进行了更新UI的操作,也许是在TextView显示了一行文字,也许是改变了ImageView显示的图片,虽然只是看似简单并且正确的操作,但是Android系统让你的程序光荣的崩溃了,并且你还不知道为什么错,这才是最痛苦的,曾经深受这种痛苦的我,为了不再让这种痛苦蔓延下去,我决定把更新UI的几种方法给大家好好说说,让大家在Thread的run方法中可以随心所欲的更新UI,再也不用痛苦了。


实现

  • 利用Handler类的post方法

        我们首先需要在MainActivity中生成一个Handler类的对象,可以不用实现handMessage方法,因为Handler类的对象此时不是处理消息而是充当发送消息的角色。

handler.post(new Runnable() {

            @Override
            public void run() {
                mTextView.setText("OK");
            }
        });

    这样,我们出入一个Runnable,在里面实现我们更新UI的代码,然后就可以更新了,不会崩溃的。

  • 利用Handler自己的处理消息的方法
         我们知道Handler可以发送消息也可以处理消息,第一种方法我们用到了发送消息的功能,现在我们用它处理消息的功能。 我们需要生成一个Handler对象,并且我们需要覆盖它的处理消息的方法,然后我们自己实现我们需要的内容,如下面所示:
private Handler handler = new Handler(){
        public void handleMessage(android.os.Message msg){
            mTextView.setText("ok");
        };
    };

     可以看到,我覆盖了handleMessage方法,然后在里面我添加了更新UI的代码,当然也是正确的,可以成功的更新UI。然后我们需要在MainActivity中调用Handler的发送消息的方法,给自己发送消息,然后才能处理,我们可以简单的调用一个方法发送一个空消息即可:handler.sendEmptyMessage(0);

  • 在runOnUiThread方法中更新UI
runOnUiThread(new Runnable() {

            @Override
            public void run() {
                mTextView.setText("updateUI->ok");

            }
        });

    runOnUiThread方法,根据其名称我们就可以知道这个方法可能就是用来更新UI的,因为更新UI必须在UI线程,其他线程不允许更新UI,所以我们在runOnUiThread方法中传入一个Runnable,然后我们在里面实现我们的操作就可以了。这个方法和第一个方法还是很像的,我个人还是比较喜欢这个方法的,因为它不需要一个Handler的对象,我觉得很方便啦。

  • View调用post方法实现更新UI
         其他的三种方法我们都是通过其他的类和方法来实现View的更新,最后一个方法是View自己调用自己的方法来实现更新,不过还都是大同小异的问题,最后实现的原理还都是差不多的。
mTextView.post(new Runnable() {

            @Override
            public void run() {
                mTextView.setText("ViewUI->ok");
            }
        });

     我们同样需要传入Runnable,然后更新就可以了。


总结

    因为Android系统在设计的时候就不让我们在非UI线程进行更新UI的操作,不仅如此我们也不能在UI线程进行连接网络的操作,如果不知道的朋友可能会被坑死吧(本人已被坑过),都是为了UI线程的安全性,我们如果需要在UI线程进行更新操作,比如显示下载进度啦,更新进度条等等,我们这时候就需要一个能在UI线程和非UI线程进行通信的对象,通知UI线程去更新非UI线程的要求,这个对象我想Handler应该就是它了,至于Handler的重要性,我就不累述了,有兴趣的大家可以自己去找一些相关的资料来看,弄懂Handler机制的存在意义及使用方法,相信对开发还是很有帮助的。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。