android项目实战之数据绑定的数据更新

引言

早期的界面数据更新,有多种方式。UI的更新必须在主线程中完成,所以不管上述那种方法,都是将更新UI的消息发送到了主线程的消息对象,让主线程做处理;

  1. Handler

    Handler mHandler = new Handler() {

    复制代码
         @Override  
         public void handleMessage(Message msg) {  
             super.handleMessage(msg);  
             switch (msg.what) {  
             case 0:  
                 //完成主界面更新,拿到数据  
                 String data = (String)msg.obj;  
                   
                 updateWeather();  
                 textView.setText(data);  
                 break;  
             default:  
                 break;  
             }  
         }  
       
     };
  2. 子线程发消息,通知Handler完成UI更新:

    private void updateWeather() {
    new Thread(new Runnable(){

    复制代码
             @Override  
             public void run() {  
                 //耗时操作,完成之后发送消息给Handler,完成UI更新;  
                 mHandler.sendEmptyMessage(0);  
                   
                 //需要数据传递,用下面方法;  
                 Message msg =new Message();  
                 msg.obj = "数据";//可以是基本类型,可以是对象,可以是List、map等;  
                 mHandler.sendMessage(msg);  
             }         
         }).start();       
     }
  3. runOnUiThread方法更新

    new Thread() {
    public void run() {
    //这儿是耗时操作,完成之后更新UI;
    runOnUiThread(new Runnable(){

    @Override
    public void run() {
    //更新UI
    imageView.setImageBitmap(bitmap);
    }

    复制代码
                 });  
             }  

    }.start();

  4. View.post(Runnable r)

    imageView.post(new Runnable(){

    @Override
    public void run() {
    imageView.setImageBitmap(bitmap);
    }

    复制代码
                 });

改进方式

使用数据绑定方式

  1. 可观察对象,如

    复制代码
     private static class User extends BaseObservable {
         private String firstName;
         private String lastName;
    
         @Bindable
         public String getFirstName() {
             return this.firstName;
         }
    
         @Bindable
         public String getLastName() {
             return this.lastName;
         }
    
         public void setFirstName(String firstName) {
             this.firstName = firstName;
             notifyPropertyChanged(BR.firstName);
         }
    
         public void setLastName(String lastName) {
             this.lastName = lastName;
             notifyPropertyChanged(BR.lastName);
         }
     }
  2. XML布局使用,如图

    <data> <import type="android.databinding.ObservableMap"/> <variable name="user" type="ObservableMap<String, Object>"/> </data> ... <TextView android:text="@{user.lastName}" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <TextView android:text="@{String.valueOf(1 + (Integer)user.age)}" android:layout_width="wrap_content" android:layout_height="wrap_content"/>

欢迎点赞、收藏、评论。

相关推荐
_李小白1 小时前
【Android FrameWork】延伸阅读:ViewRootImpl如何管理整个view世界
android
Yang-Never2 小时前
Open GL ES->以指定点为中心缩放图片纹理的完整图解
android·java·开发语言·kotlin·android studio
介一安全2 小时前
【Frida Android】实战篇11:企业常用加密场景 Hook(1)
android·网络安全·逆向·安全性测试·frida
峥嵘life2 小时前
Android EDLA 认证测试内容详解
android
eybk3 小时前
局域网文件传输器安卓版本+win版本
android·python
未来猫咪花3 小时前
LiveData "数据倒灌":一个流行的错误概念
android·android jetpack
2501_937154933 小时前
神马影视 8.8 源码:1.5 秒加载 + 双系统部署
android·源码·源代码管理·机顶盒
吳所畏惧3 小时前
少走弯路:uniapp里将h5链接打包为apk,并设置顶/底部安全区域自动填充显示,阻止webview默认全屏化
android·安全·uni-app·json·html5·webview·js
金士顿4 小时前
Ethercat耦合器添加的IO导出xml 初始化IO参数
android·xml·java
电饭叔4 小时前
Luhn算法与信用卡识别完善《python语言程序设计》2018版--第8章14题利用字符串输入作为一个信用卡号之三
android·python·算法