美文网首页
Jetpack之LiveData

Jetpack之LiveData

作者: 放羊娃华振 | 来源:发表于2022-09-13 22:25 被阅读0次

    一、概述

    LiveData 是一种可观察的数据存储器类。与常规的可观察类不同,LiveData 具有生命周期感知能力,意指它遵循其他应用组件(如 activity、fragment 或 service)的生命周期。这种感知能力可确保 LiveData 仅更新处于活跃生命周期状态的应用组件观察者。描述来自官网:链接

    二、使用LiveData的优势

    • 确保界面符合数据状态
      LiveData 遵循观察者模式。当底层数据发生变化时,LiveData 会通知 Observer 对象。您可以整合代码以在这些 Observer 对象中更新界面。这样一来,您无需在每次应用数据发生变化时更新界面,因为观察者会替您完成更新。
    • 不会发生内存泄漏
      观察者会绑定到 Lifecycle 对象,并在其关联的生命周期遭到销毁后进行自我清理。
    • 不会因 Activity 停止而导致崩溃
      如果观察者的生命周期处于非活跃状态(如返回堆栈中的 activity),它便不会接收任何 LiveData 事件。
    • 不再需要手动处理生命周期
      界面组件只是观察相关数据,不会停止或恢复观察。LiveData 将自动管理所有这些操作,因为它在观察时可以感知相关的生命周期状态变化。
    • 数据始终保持最新状态
      如果生命周期变为非活跃状态,它会在再次变为活跃状态时接收最新的数据。例如,曾经在后台的 Activity 会在返回前台后立即接收最新的数据。
    • 适当的配置更改
      如果由于配置更改(如设备旋转)而重新创建了 activity 或 fragment,它会立即接收最新的可用数据。
    • 共享资源
      您可以使用单例模式扩展 LiveData 对象以封装系统服务,以便在应用中共享它们。LiveData 对象连接到系统服务一次,然后需要相应资源的任何观察者只需观察 LiveData 对象。如需了解详情,请参阅扩展 LiveData

    三、LiveData的使用

    1.创建LiveData,一般将LivaData封装在ViewModel中,例如:

    public class NameViewModel extends ViewModel {
    
    // Create a LiveData with a String
    private MutableLiveData<String> currentName;
    
        public MutableLiveData<String> getCurrentName() {
            if (currentName == null) {
                currentName = new MutableLiveData<String>();
            }
            return currentName;
        }
    
    // Rest of the ViewModel...
    }
    
    1. 创建观察LiveData对象
    public class NameActivity extends AppCompatActivity {
    
        private NameViewModel model;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            // Other code to setup the activity...
    
            // Get the ViewModel.
            model = new ViewModelProvider(this).get(NameViewModel.class);
    
            // Create the observer which updates the UI.
            final Observer<String> nameObserver = new Observer<String>() {
                @Override
                public void onChanged(@Nullable final String newName) {
                    // Update the UI, in this case, a TextView.
                    nameTextView.setText(newName);
                }
            };
    
            // Observe the LiveData, passing in this activity as the LifecycleOwner and the observer.
            model.getCurrentName().observe(this, nameObserver);
        }
    }
    
    1. 更新LiveData对象
    button.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            String anotherName = "John Doe";
            model.getCurrentName().setValue(anotherName);
        }
    });
    

    四、LiveData小知识?

    1.postValue和setValue 的区别是什么?

    如果在主线程中调用需要调用postValue()方法。随便贴下post切换线程的逻辑代码:

        @Override
        public void postToMainThread(Runnable runnable) {
            if (mMainHandler == null) {
                synchronized (mLock) {
                    if (mMainHandler == null) {
                        mMainHandler = createAsync(Looper.getMainLooper());
                    }
                }
            }
            //noinspection ConstantConditions
            mMainHandler.post(runnable);
        }
    
    1.LiveData和MutableLiveData的区别是什么?问题参考链接
    • MutableLiveData的父类是LiveData;
    • LiveData在实体类里可以通知指定某个字段的数据更新;
    • MutableLiveData则是完全是整个实体类或者数据类型变化后才通知.不会细节到某个字段。

    相关文章

      网友评论

          本文标题:Jetpack之LiveData

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