Jetpack之LiveData扩展MediatorLiveData

Posted Jason_Lee155

tags:

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

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里点这个类进入源码看看就行了。

以上是关于Jetpack之LiveData扩展MediatorLiveData的主要内容,如果未能解决你的问题,请参考以下文章

jetpack之LiveData

jetpack之LiveData

jetpack之LiveData

Android Jetpack之LiveData源码分析

Jetpack 之 LiveData

Android kotlin 系列讲解(进阶篇)Jetpack系列之LiveData