上海家装设计网站,建设网站审批,企业网站的功能主要有,濮阳做网站的价格1.ViewModel
解决问题#xff1a;
瞬态数据丢失异步调用内存泄漏类膨胀提高维护难度和测试难度
作用#xff1a;
介于View视图和Model数据模型之间桥梁使视图和数据能够分离#xff0c;也能保持通信
public class MainActivity extends AppCompatActivity {private Tex…1.ViewModel
解决问题
瞬态数据丢失异步调用内存泄漏类膨胀提高维护难度和测试难度
作用
介于View视图和Model数据模型之间桥梁使视图和数据能够分离也能保持通信
public class MainActivity extends AppCompatActivity {private TextView textView;private MyViewModel viewModel;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);textView findViewById(R.id.textView);viewModel new ViewModelProvider(this, new ViewModelProvider.AndroidViewModelFactory()).get(MyViewModel.class);textView.setText(String.valueOf(viewModel.number));}public void plusNumber(View view) {textView.setText(String.valueOf(viewModel.number));}
}public class MyViewModel extends ViewModel {public int number;}
2.LiveData
LiveData是Android架构组件中的一部分用于在数据源和UI之间建立连接实现数据的实时更新和同步。它允许观察者例如Activity或Fragment订阅数据变化并在数据发生变化时自动更新UI。
基本概念LiveData是一个可观察的数据持有者类它遵循观察者模式。这意味着它可以持有数据并且当数据发生变化时它会通知所有已订阅的观察者。这在处理生命周期相关的数据时非常有用因为它可以确保只有当活动或片段处于激活状态时才会接收到更新。工作原理LiveData的核心是LifecycleOwner通常是Activity或Fragment。当LiveData对象有新数据时它会检查是否有活跃的观察者并通知它们。如果观察者已经销毁如Activity已经停止或Fragment已经分离那么LiveData就不会再发送通知从而避免了内存泄漏。使用步骤要使用LiveData首先需要在项目的build.gradle文件中添加依赖。然后可以在ViewModel中创建LiveData对象并在UI层如Activity或Fragment中观察它。当LiveData对象的数据改变时UI会自动更新。应用场景LiveData适用于多种场景包括但不限于配置更改、网络状态变化、数据库操作等。它特别适用于需要响应配置更改如屏幕旋转的场景因为在这些情况下观察者可能会被销毁并重新创建而LiveData能够确保在这些过程中不会发生内存泄漏。双向绑定虽然LiveData本身不直接支持双向绑定但可以与DataBinding库结合使用通过将LiveData对象与UI元素绑定来实现双向绑定的效果。数据更新当LiveData中的数据发生变化时所有订阅了该LiveData的观察者都会收到通知从而实现UI的自动更新。事件处理LiveData还提供了Transformations API允许开发者对LiveData对象进行转换和组合以实现更复杂的数据处理逻辑。高级功能除了基本的数据持有和通知功能外LiveData还提供了一些高级功能如切换地图类型、设置筛选条件等这些功能使得LiveData更加灵活和强大。
public class MyViewModel extends ViewModel {private MutableLiveDataInteger currentSecond;public MutableLiveDataInteger getCurrentSecond(){if (currentSecond null){currentSecond new MutableLiveData();currentSecond.setValue(0);}return currentSecond;}
}public class MainActivity extends AppCompatActivity {private TextView textView;private MyViewModel viewModel;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);textView findViewById(R.id.textView);viewModel new ViewModelProvider(this, new ViewModelProvider.AndroidViewModelFactory()).get(MyViewModel.class);textView.setText(String.valueOf(viewModel.getCurrentSecond()));viewModel.getCurrentSecond().observe(this, new ObserverInteger() {Overridepublic void onChanged(Integer integer) {textView.setText(String.valueOf(integer));}});startTimer();}private void startTimer(){new Timer().schedule(new TimerTask() {Overridepublic void run() {// 非ui线程 postValue// ui线程 setValueviewModel.getCurrentSecond().postValue(viewModel.getCurrentSecond().getValue()1);}},1000,1000);}
}3.DataBinding
Android DataBinding是Google在Jetpack中推出的一款数据绑定的支持库它通过将数据源直接与UI元素进行绑定来实现数据与视图之间的自动更新。 对DataBinding的详细介绍
基本概念DataBinding是一种强大的数据绑定技术它能够实现视图和数据之间的自动更新。开发者可以将数据直接绑定到视图上从而简化了视图和数据之间的操作提高了代码的可读性和可维护性。工作原理DataBinding的工作原理主要依赖于数据绑定引擎和数据对象。数据绑定引擎负责管理数据和视图之间的关系当数据发生变化时引擎会自动更新视图。而数据对象则是数据的载体它可以是任何对象只要实现了相应的数据接口。使用步骤启用DataBinding需要在app module的build.gradle中添加相应代码。布局文件需要更改为layout节点并引入data节点同时创建好需要用到的Model。在Activity或Fragment中用DataBindingUtil.setContentView(Activity activity, int layoutId)代替setContentViewint layoutId同时初始化数据并进行绑定。应用场景列表展示、条件渲染、数据绑定布局、MVVM架构等都是DataBinding的应用场景。DataBinding与MVVM架构相结合可以实现更好的代码分离和组件化开发。双向绑定双向绑定的效果是数据影响界面界面变化也要使得数据发生变化。例如EditText输入内容时绑定的数据bean要跟着变化。数据更新Databinding通过使用实现Observable的数据当数据更新的时候自动更新UI。监听对象变化更新。事件处理事件处理包括方法引用和监听绑定两种方式。高级功能DataBinding支持在普通方法上添加注解来添加自定义控件属性。这提供了更大的灵活性允许开发者根据需要定制控件的行为
public class MainActivity extends AppCompatActivity {Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);ActivityMainBinding binding DataBindingUtil.setContentView(this, R.layout.activity_main);Idol idol new Idol(蔡徐坤, 五星);binding.setIdol(idol);}
}?xml version1.0 encodingutf-8?
layout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoxmlns:toolshttp://schemas.android.com/toolsdatavariablenameidoltypecom.zzzjian.databinding.Idol //dataandroidx.constraintlayout.widget.ConstraintLayoutandroid:idid/mainandroid:layout_widthmatch_parentandroid:layout_heightmatch_parenttools:context.MainActivityandroidx.constraintlayout.widget.Guidelineandroid:idid/guidelineandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:orientationhorizontalapp:layout_constraintGuide_begin365dp /ImageViewandroid:idid/imageView2android:layout_width300dipandroid:layout_height300dipandroid:contentDescriptionTODOapp:layout_constraintBottom_toTopOfid/guidelineapp:layout_constraintEnd_toEndOfparentapp:layout_constraintStart_toStartOfparentandroid:srcdrawable/ikunapp:layout_constraintTop_toTopOfparenttools:srctools:sample/avatars /TextViewandroid:idid/textViewandroid:layout_widthwrap_contentandroid:layout_heightwrap_contenttools:text姓名android:text{idol.name}android:textSize24spapp:layout_constraintBottom_toBottomOfparentapp:layout_constraintEnd_toEndOfparentapp:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toTopOfid/guidelineapp:layout_constraintVertical_bias0.245 /TextViewandroid:idid/textView2android:layout_widthwrap_contentandroid:layout_heightwrap_contenttools:text五星android:text{idol.star}android:textSize24spapp:layout_constraintBottom_toBottomOfparentapp:layout_constraintEnd_toEndOfparentapp:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toTopOfid/guideline //androidx.constraintlayout.widget.ConstraintLayout
/layout