• liveData和viewBinding的使用


    ViewModel:
    官方解释:保存UI数据的类,会在配置变更(如手机屏幕的旋转)后继续存在。
    view Model不应持有context,否则在Activity销毁后View Model仍然持有Activity的context,造成内存泄漏;可以继承AndroidViewModel,或者选择application context

    liveData:
    1.建立data类

    public class Time {
        private MutableLiveData<Integer> seconds = new MutableLiveData<>();
    
        public MutableLiveData<Integer> getSeconds() {
            return seconds;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2.继承View Model

    public class TestViewModel extends ViewModel {
        private Time time;
    
        public TestViewModel(){
            time = new Time();
            // 修改liveData包装的数据,主线程用setValue,其他线程PostValue
            time.getSeconds().setValue(0);
        }
    
        public Time getLiveData(){
            return time;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    3.observe数据

    private TestViewModel vm;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        vm = new TestViewModel();
        vm.getLiveData().getSeconds().observe(this, new Observer<Integer>() {
            @Override
            public void onChanged(Integer integer) {
                EditText ed = findViewById(R.id.ed);
                ed.setText(""+integer);
            }
        });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    viewBinding:
    1.build.gradle添加

    buildFeatures {
        viewBinding true
    }
    
    • 1
    • 2
    • 3

    根视图和所有有ID的视图都会根据xml文件名称,生成对应的Binding类
    2. 在Activity中使用view Binding

    ActivityMainBinding binding = ActivityMainBinding.inflate(getLayoutInflater());
    View view = binding.getRoot();
    setContentView(view);
    
    • 1
    • 2
    • 3

    如果找不到Binding类,可能是名字错了,顺序再调一下可能就对了
    Fragment中使用view Binding

     @Override
        public View onCreateView (LayoutInflater inflater,
                                  ViewGroup container,
                                  Bundle savedInstanceState) {
            ActivityMainBinding binding = ResultProfileBinding.inflate(inflater, container, false);
            View view = binding.getRoot();
            return view;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    由于fragment的生命周期更长,所以务必在destroy解除绑定

    @Override
        public void onDestroyView() {
            super.onDestroyView();
            binding = null;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
  • 相关阅读:
    UVM实战笔记(二)
    【Log日志】springboot项目中集成Log日志详解
    服务网格和CI/CD集成:讨论服务网格在持续集成和持续交付中的应用。
    四十九.强化学习基础
    milvus集合管理
    system_error错误处理库学习
    1--新唐nuc980 NUC980移植 UBOOT,从外部mx25l启动
    十年技术进阶路,让我明白了三件要事(8000字长文)
    怎样下载视频号视频?分享6种有效方法
    Unreal&LatentAction的能与不能
  • 原文地址:https://blog.csdn.net/weixin_45369680/article/details/127693900