ViewModel、LiveData、Lifecycle的使用

ViewModel

ViewModel 类旨在以注重生命周期的方式存储和管理界面相关的数据。ViewModel 类让数据可在发生屏幕旋转等配置更改后继续留存。
原理图
在这里插入图片描述

  1. 创建一个继承viewModel的类
public class MyViewModel extends ViewModel {
	// 需要保存的数据
    int count = 0;
    
}
  1. 为Activity添加一个ViewModel的成员,并且实例化
public class MainActivity extends AppCompatActivity {

	private MyViewModel myViewModel;

	publid void onCreate(){

		myViewModel = new ViewModelProvider(this).get(MyViewModel.class);
}
}

在这之前先添加上依赖

implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
  1. 使用ViewModelProvider创建的ViewModel能保证是同一个,即使Activity被销毁再创建也是,这样就能保存下很多数据。
  2. 像ViewModel传递初始参数
    如果ViewModel构造参数函数需要向ViewModel传递数据的话,就需要借助到ViewModelProvider.Factory,下面看一个例子
public class MainViewModelFactory implements ViewModelProvider.Factory {

    private int count;

    public MainViewModelFactory(int count) {
        this.count = count;
    }

    @Override
    public <T extends ViewModel> T create( Class<T> modelClass) {
    	// 这里的MainViewModel也是一个ViewModel,和上面不是同一个
        return (T) new MainViewModel(count);
    }
}

创建ViewModel实例时使用

mainViewModel = new ViewModelProvider(this,new MainViewModelFactory(num)).get(MainViewModel.class);

LiveData

LiveData是JetPack提供的一种响应式编程组件,它可以包含任意类型的数据,并在数据发生变化时通知给活跃状态的观察者(比如Activity处于Start或者Resume状态),在ACtivity销毁时及时释放引用(熟悉吗?想一想怎么实现的),它特别适合和ViewModel结合使用(实例演示)。

public class MainViewModel extends ViewModel {
    // LiveData 成员
    public MutableLiveData<Integer> counter=new MutableLiveData<>();

    public MainViewModel(int count){
        counter.setValue(count);
    }

    void addOne(){
        counter.setValue(counter.getValue()+1);
    }

    int getCount(){
        return counter.getValue();
    }
}

我实例化了一个MutableLiveData的成员,将其泛型指定为int类型,LiveData有三个成员函数setValue(), getValue(), postValue(), 其中在其他线程中传递数据一定要用 postValue()而不能用setValue()。同样我们在Activity中初始化

mainViewModel = new ViewModelProvider(this,new MainViewModelFactory(num)).get(MainViewModel.class);

为LiveData设置好数据变化时的回调函数

        mainViewModel.counter.observe(this, new Observer<Integer>() {
            @Override
            public void onChanged(Integer integer) {
                textView.setText(String.valueOf(integer));
            }
        });

数据变化时更新UI,可以使用handler测试一下,延迟几秒后更新value,UI也会被更新。

Lifecycles

概述
它是一个生命周期感知型组件,当被观察的组件的生命周期改变时可以执行操作来进行响应。简单的来说,可以通过它来监测如Activity,Fragment等具有生命周期的组件,并做出响应,从而依赖组件的代码从生命周期方法移入组件本身中,便于维护。
lifecycle中两个角色

  • LifeCycleOwner(生命周期拥有者),如Activity,Fragment,Service等
  • LifeCycleObserver(生命周期观察者),任何自定义类。

使用场景

  • 自定义View需要在Activity的onResume,onStop 或者其他状态下,进行动画显示数据加载保存等操作。(后面有演示)
  • 某些框架需要追踪Activity的生命周期变化,做出一些操作,比如之前培训的换肤框架,在Activity创建时进行换肤。
  • MVP框架中,在Activity的不同生命周期可能需要调用p中的某些方法,如果通过lifecycle联系起来,就可以减少Activity这个主动调用的过程,p中的方法会自动感知并调用,减少Activity的代码量。
public class MyObserver implements LifecycleObserver {

    private Lifecycle lifecycle;

    public MyObserver(Lifecycle lifecycle) {
        this.lifecycle = lifecycle;
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    void onCreated(){
        Log.d("lifecycle",lifecycle.getCurrentState().toString());
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    void onStart(){
        Log.d("lifecycle",lifecycle.getCurrentState().toString());
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    void onResume(){
        Log.d("lifecycle",lifecycle.getCurrentState().toString());
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    void onPause() {
        Log.d("lifecycle",lifecycle.getCurrentState().toString());
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    void onStop(){
        Log.d("lifecycle",lifecycle.getCurrentState().toString());
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    void onDestory(){
        Log.d("lifecycle",lifecycle.getCurrentState().toString());
    }
}

在Activity中

getLifecycle().addObserver(new MyObserver(this.getLifecycle()));

这里为什么要把Activity本LifeCycle对象传递进去呢?因为获得Lifecycle对象后,就可以随时调用它的getCurrentState()方法获得其状态了。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的示例: 首先,我们需要在 `build.gradle` 文件中添加以下依赖项: ``` implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0' ``` 然后,我们需要创建一个包含计分逻辑的 `ScoreViewModel` 类,该类将托管我们的数据。该类需要继承自 `ViewModel`。 ```kotlin import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel class ScoreViewModel : ViewModel() { val teamAScore = MutableLiveData<Int>() val teamBScore = MutableLiveData<Int>() init { teamAScore.value = 0 teamBScore.value = 0 } fun addTeamAScore() { teamAScore.value = teamAScore.value?.plus(1) } fun addTeamBScore() { teamBScore.value = teamBScore.value?.plus(1) } } ``` 上述代码中,我们创建了一个 `ScoreViewModel` 类,该类包含两个 `MutableLiveData`,即 `teamAScore` 和 `teamBScore`。这两个变量存储着两个球队的得分,并且在我们的应用程序中可以随时更新。 我们还包含了两个方法 `addTeamAScore()` 和 `addTeamBScore()`,分别用于增加对应球队的得分。 接下来,我们需要创建一个 `MainActivity` 类,该类将托管我们的用户界面。 ```kotlin import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProviders import kotlinx.android.synthetic.main.activity_main.* class MainActivity : AppCompatActivity() { private lateinit var scoreViewModel: ScoreViewModel override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) scoreViewModel = ViewModelProviders.of(this).get(ScoreViewModel::class.java) scoreViewModel.teamAScore.observe(this, Observer { score -> team_a_score.text = score.toString() }) scoreViewModel.teamBScore.observe(this, Observer { score -> team_b_score.text = score.toString() }) team_a_plus.setOnClickListener { scoreViewModel.addTeamAScore() } team_b_plus.setOnClickListener { scoreViewModel.addTeamBScore() } } } ``` 上述代码中,我们创建了一个 `MainActivity` 类,并在其中创建了一个 `ScoreViewModel` 的实例。 我们还使用了 `ViewModelProviders.of()` 方法来获取 `ScoreViewModel` 的实例,并使用 `observe()` 方法来观察 `teamAScore` 和 `teamBScore` 变量。每当这些变量更新时,我们将更新 UI 中对应的文本视图。 最后,我们为两个加分按钮设置了点击侦听器,并使用 `addTeamAScore()` 和 `addTeamBScore()` 方法来增加对应球队的得分。 现在,当您运行应用程序时,您将看到两个球队的得分,并且您可以使用加分按钮来增加它们的分数。同时,这些更改将保存在 `ScoreViewModel` 中,并在配置更改后保持不变。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值