Android UI更新的几种方法

作者: 心若冰清_ | 来源:发表于2017-06-17 11:59 被阅读179次

    前言


    在android开发中,界面UI的更新都是在主线程来完成的。线程分为主线程(Main Thread,简称MT)和工作线程(Work Thread,简称WT),我们通常会在WT中执行一些比较耗时的操作,比如下载,网络,缓存等,然后在将结果发送给MT进行UI的更新操作。如果是在WT进行UI的更新,则会抛出异常,android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.(只有创建这个View的原始线程才能修改这个view)。
    在BT搜索、WIFI搜索、其他需要更新View的UI过程中,很多是采用广播的方式通知搜索的结果,实时的显示到listview中进行UI的更新操作。通常会使用以下几种方式进行UI的更新:handler,runOnUiThread,子线程发送Message。


    一、Activity.runOnUiThread


    利用Activity.runOnUiThread(Runnable)把更新ui的代码创建在Runnable中,然后在需要更新 ui时,把这个Runnable对象传给Activity.runOnUiThread(Runnable)。这样Runnable对像就能在ui程序中被调用。如果当前线程是UI线程,那么行动是立即执行。如果当前线程不是UI线程,操作是发布到事件队列的UI线程。

    mActivity.runOnUiThread(new Runnable() {
        @Override
        public void run() {
            Log.e(TAG, "开始添加设备!");
            addDevice(device);
        }
    });
    

    二、handler.post(Runnable)


    handler.post(new Runnable() {
        @Override
        public void run() {
            addDevice(device);
        }
    });
    

    三、子线程发送Message


    首先在需要执行更新的位置添加以下代码

    new Thread(new Runnable() {
        @Override
        public void run() {
            //Message msg = new Message();
            //msg.what = 0x06;
            //handler.sendMessage(msg);
            handler.sendEmptyMessage(0x06);
        }
    }).start();
    

    然后进入handler下进行处理

    final Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                    case 0x06:
                       addDevice(device);
                    break;
                default:
                    break;
            }
            super.handleMessage(msg);
        }
    };
    

    以上三种方法都可以实现UI的更新,掌握哪种方式取决于代码中的叠加度,不过个人推荐使用方法一

    相关文章

      网友评论

        本文标题:Android UI更新的几种方法

        本文链接:https://www.haomeiwen.com/subject/bnbvqxtx.html