美文网首页
Jetpack学习-3-LiveData

Jetpack学习-3-LiveData

作者: 主音King | 来源:发表于2020-08-14 13:24 被阅读0次

LiveData是什么

可观察的数据存储类,具有生命周期感知能力

简单使用

一般和ViewModel使用;自定义ViewModel

public class LiveDataSub extends ViewModel {
    private MutableLiveData<String> infos;
    private int number;

    public MutableLiveData<String> getInfos() {
        if (infos==null){
            infos = new MutableLiveData<>();
        }
        return infos;
    }

    public int increaseNumber(){
        number++;
        return number;
    }
}

MutableLiveData类型;提供访问方法getInfo
在Activity中使用:lifecycle-viewmodel-2.1.0-sources中的ViewModelProvider

public class LiveDataActivity extends AppCompatActivity {
    private TextView tv;
    private LiveDataSub viewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_live_data);
        tv = findViewById(R.id.tv);
        // v2.2.0之后弃用了ViewModelProviders.of(2.0.0可用);建议用 new ViewModelProvider 方式。
        viewModel = new ViewModelProvider(this, new ViewModelProvider.NewInstanceFactory()).get(LiveDataSub.class);
        // 监听info改变
        viewModel.getInfos().observe(this, s -> tv.setText(s));
        // 改变info值
        tv.setOnClickListener(v -> {
            String info = "info:" + viewModel.increaseNumber();
            viewModel.getInfos().setValue(info);
        });
    }
}

通过ViewModelProvider来实例化定义ViewModel,调用LiveData的observer添加当前Activity观察。
通过LiveData的setValue更新数据,界面会自动更新。

原理

observer方法调用要求在主线程。如果activity对应的lifecycle已经处于Destroy状态,则会直接返回,不添加observer。最终还是调用了lifecycle的addObserver方法。
数据更新,通过LiveData的setValue。要求在主线程执行。内部调用dispatchingValue方法,最终调用onChange。


image.png

相关文章

网友评论

      本文标题:Jetpack学习-3-LiveData

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