LiveData使用
1.在Activity 中 通过 ViewModelProvider(this).get(XxxViewModel::class.java)
获取到XxxViewModel对象
2.通过XxxViewModel对象获取到定义在XxxViewModel中的liveData
3.通过liveData的observe方法 监测数据发生改变回调弹出吐丝
4.通过按钮点击事件模拟数据发生改变
代码如下:
//Activity中代码
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
observeLiveData()
}
fun onClick(v: View) {
when (v.id) {
//通过按钮点击事件模拟数据发生改变
R.id.btn_00 -> {
var viewModel = ViewModelProvider(this).get(MusicViewModel::class.java)
viewModel.changeItem(0,"009")
}
}
}
fun observeLiveData(){
var viewModel = ViewModelProvider(this).get(MusicViewModel::class.java)
viewModel.musics.observe(this, Observer<List<String>>() { str ->
//数据发生改变 弹出吐司
Toast.makeText(this, str.toString(), Toast.LENGTH_SHORT).show()
})
}
复制代码
public class MusicViewModel extends ViewModel {
// 定义一个对象,相当于用来存放数据的仓库
private static MutableLiveData<List<String>> liveData;
/**
* 用于获取数据
* 并保存到LiveData中(可以理解成数据仓库)
*/
public MutableLiveData<List<String>> getMusics() {
if (liveData == null) {
List<String> musics = loadMusics();
liveData = new MutableLiveData<>();
//liveData.setValue(musics);
// 把数据存放到仓库
// post 和 set 是跟同步异步区别
liveData.postValue(musics);
}
return liveData;
}
/**
* 加载数据
* 可以从本地或者通过服务端请求获得
*/
private List<String> loadMusics() {
List<String> musics = new ArrayList<>();
musics.add("001");
musics.add("002");
musics.add("003");
return musics;
}
/**
* 修改某条数据
*/
public void changeItem(int index, String music) {
List<String> musics = liveData.getValue();
musics.set(index, music);
liveData.postValue(musics);
}
}
复制代码
LiveData简单封装成LiveDataBus实现EventBus发布订阅式效果:
LiveDataBus
public class LiveDataBus {
private static LiveDataBus instance;
private Map<String, MutableLiveData> bus;
public static LiveDataBus getInstance() {
if (instance == null) {
synchronized (LiveDataBus.class) {
if (instance == null) {
instance = new LiveDataBus();
}
}
}
return instance;
}
private LiveDataBus() {
bus = new ConcurrentHashMap<>();
}
public synchronized <T> MutableLiveData<T> with(String key, Class<T> type) {
if (!bus.containsKey(key)) {
bus.put(key, new MutableLiveData<>());
}
// 如果不需要阻止黏性事件,则换回MutableLiveData
return (MutableLiveData<T>) bus.get(key);
}
}
复制代码
在Activity中使用LiveDataBus:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
registerLiveDataBus()
}
fun registerLiveDataBus(){
//这里我们注册一个test01事件 参数类型是String
LiveDataBus.getInstance().with("test01",String::class.java)
.observe(this, Observer<String>() {str->
Toast.makeText(this, str, Toast.LENGTH_SHORT).show()
})
}
fun onClick(v: View) {
when (v.id) {
//发送事件 上面registerLiveDataBus方法中就会弹出吐司
R.id.btn_00 -> {
LiveDataBus.getInstance().with("test01",String::class.java)
.postValue("001")
}
}
}
复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END