ViewModel与LiveData的简单使用

Posted super码王

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ViewModel与LiveData的简单使用相关的知识,希望对你有一定的参考价值。

使用注意点

LiveData与ViewModel一般都是配合着一起使用。

第一步:创建ViewModel类

package com.example.jetpackdemo03;

import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;

public class NameViewModel extends ViewModel 

    private MutableLiveData<String> currentName;
    public int i;

    public MutableLiveData<String> getCurrentName() 
        if (currentName == null) 
            currentName = new MutableLiveData<>();
        
        return currentName;
    

第二步:实例化 ViewModel 、创建监听者、绑定监听者

package com.example.jetpackdemo03;

import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity 

    private NameViewModel model;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //获取控件
        Button btn = findViewById(R.id.btn);
        TextView tv = findViewById(R.id.tv);

        // ViewModel 实例的创建
        ViewModelProvider.AndroidViewModelFactory instance = ViewModelProvider.AndroidViewModelFactory.getInstance(getApplication());
        model = new ViewModelProvider(this, instance).get(NameViewModel.class);

        //需要一个观察者来观察数据
        Observer observer = new Observer<String>() 
            @Override
            public void onChanged(String string) 
                tv.setText(string);
            
        ;

        //订阅
        model.getCurrentName().observe(this, observer);

        //设置点击事件
        btn.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View view) 
                model.getCurrentName().setValue("wustyq" + (model.i++));
            
        );

    

优化 LiveData 的管理

  • 使用单例模式
package com.example.jetpackdemo03;

import androidx.lifecycle.MutableLiveData;

import java.util.HashMap;
import java.util.Map;

public class LiveDataBus 

    //存放订阅者
    private Map<String, MutableLiveData<Object>> bus;

    private static LiveDataBus liveDataBus = new LiveDataBus();

    public LiveDataBus() 
        bus = new HashMap<>();
    

    private static LiveDataBus getInstance() 
        return liveDataBus;
    

    //注册订阅者
    public synchronized <T> MutableLiveData<T> with(String key, Class<T> type) 
        if (!bus.containsKey(key)) 
            bus.put(key, new MutableLiveData<Object>());
        

        return (MutableLiveData) bus.get(key);
    

以上是关于ViewModel与LiveData的简单使用的主要内容,如果未能解决你的问题,请参考以下文章

JetpackLiveData 架构组件 ( LiveData 简介 | LiveData 使用方法 | ViewModel + LiveData 示例 )

JetpackLiveData 架构组件 ( LiveData 简介 | LiveData 使用方法 | ViewModel + LiveData 示例 )

使用 ViewModel 和 LiveData 递增变量的简单片段示例 - 变量始终为空

Android ViewModel与LiveData组件组合使用详解

Android ViewModel与LiveData组件组合使用详解

如何将editText值传递给viewModel和Livedata(Kotlin)