LiveData的使用前面已经说过:
Android Jetpack组件之 LiveData使用-源码
但是Android库里也有一些扩展类,比如 MediatorLiveData 需要介绍下。
假设有一个需求:在ExitText中输入文字的同时,显示文字个数。当然可以用EditTextChangeListener,也可以只用一个LiveData监听输入String也可以得到length,但是这里只是举例嘛。
- class MainViewModel : ViewModel() {
- val message: MutableLiveData<String> = MutableLiveData()
- val count: MediatorLiveData<Int> = MediatorLiveData()
-
- init {
- count.value = 0
-
- count.addSource(message) {
- val cnt = message.value?.length ?: 0
- count.postValue(cnt)
- }
- }
-
- fun postMessage(message: String) {
- this.message.postValue(message)
- }
- }
MediatorLiveDarta的作用,顾名思义可以作为中间人的角色监听其他LiveData。这里可以在EditText的回调里通过postMessage更新message,count通过addSource监听message的变化后更新输入长度。
用Java版本看看:
例如:从getNameFromServer()取的值是"alan",而MediatorLiveData做了转化后成了"alan gong"。
- public class MyViewModel extends ViewModel {
- private MutableLiveData<String> liveEvent;
- private MediatorLiveData<String> testLiveData;
-
- public MyViewModel() {
- testLiveData = new MediatorLiveData<>();
- testLiveData.addSource(liveEvent, new Observer<String>() {
- @Override
- public void onChanged(String s) {
- testLiveData.postValue(s + " gong");
- }
- });
-
- getNameFromServer();
- }
-
- public MediatorLiveData<String> getTestLiveData() {
- return testLiveData;
- }
-
- private void getNameFromServer() {
- if (liveEvent == null) {
- liveEvent = new MutableLiveData<>();
- }
- liveEvent.setValue("alan");
- }
- }
-
- public class MainActivity extends AppCompatActivity {
-
- private ActivityMainBinding binding;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- binding = ActivityMainBinding.inflate(LayoutInflater.from(this));
- setContentView(binding.getRoot());
-
- ViewModelProvider provider = new ViewModelProvider(this, new ViewModelProvider.NewInstanceFactory());
- MyViewModel myViewModel = provider.get(MyViewModel.class);
- binding.setViewModel(myViewModel);
-
- myViewModel.getTestLiveData().observe(this, new Observer<String>() {
- @Override
- public void onChanged(String s) {
- textView.setText(s);
- }
- });
- }
- }
至于原理,相信会使用LiveData的都觉得没什么,studio里点这个类进入源码看看就行了。