概述
传统的组件间的通信方式有Handler、BroadcastReceiver,Interface、EventBus等等方式实现,他们有自己适合的应用场景,也有各自的弊端。这里介绍新的组件通信同时LiveData,它是一个数据持有类,具有以下特点:
- 数据可以被观察者订阅
- 能够感知组件(Fragment、Activity、Service))的生命周期
- 组件处于active状态时,会通知观察者有数据更新
对于观察者模式,不妨先看一个自己模仿LiveData写的简单的例子,数据持有类:
public class JSLiveData {
//持有的数据
public Object data;
//观察者的注册表
List<JSObserver> observers;
public JSLiveData() {
this.observers = new ArrayList<>();
}
/**
* 将观察者添加到注册表
* @param observer
*/
public void addObserver(JSObserver observer) {
observers.add(observer);
}
/**
* 发送数据
* 触发接口回调
* @param obj
*/
public void postValue(Object obj) {
this.data = obj;
for (JSObserver observer : observers) {
observer.onChange(obj);
}
}
}
将注册的观察者存放在集合里面,等待被观察者触发,实现接口回调,接口代码如下
public interface JSObserver {
void onChange(Object obj);
}
下面是具体的测试:
public class MainActivity extends AppCompatActivity {
JSLiveData liveData;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
liveData = new JSLiveData();
}
public void sendData(View view) {
liveData.postValue("123456");
}
public void registerObserver(View view) {
liveData.addObserver(new JSObserver() {
@Override
public void onChange(Object obj) {
Log.d("JSLiveData >>> ", obj.toString());
Toast.makeText(Main2Activity.this, obj.toString(),Toast.LENGTH_SHORT).show();
}
});
}
}
点击registerObserver按钮,注册观察者,添加到集合,然后点击setData按钮,触发接口回调,这里的观察者模式就是对接口做了一层封装而已。
但是如果我们先点击sendData按钮发送数据,后点击registerObserver注册观察者,还能触发接口回调吗?
我们再看看使用真实的LiveData的效果,只需要将LiveData替换一下
public class MainActivity extends AppCompatActivity {
LiveData liveData;
MutableLiveData<String> mutableLiveData;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mutableLiveData = new MutableLiveData<>();
}
public void sendData(View view) {
mutableLiveData.postValue("aaa");
}
public void registerObserver(View view) {
//注册观察者
mutableLiveData.observe(MainActivity.this, new Observer<String>() {
@Override
public void onChanged(String s) {
Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show();
}
});
}
}
无论是先注册观察者,还是后注册观察者,都会触发接口回调,
LiveData是如何做到的?如何感知组件生命周期的?带着这些问题,进入下一篇LiveData原理的源码分析
最后
以上就是听话御姐为你收集整理的Android LiveData(一):介绍和简单使用的全部内容,希望文章能够帮你解决Android LiveData(一):介绍和简单使用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复