使用LiveData时return语句的作用及数据传递逻辑疑问
你的LiveData疑问解答
先给你把代码整理成更易读的格式,再逐个拆解你的疑问:
MainActivity 代码
MainViewModel homeViewModel = ViewModelProviders.of(this).get(MainViewModel.class); homeViewModel.getResponseval().observe(this, new Observer<String>() { @Override public void onChanged(@Nullable String s) { Toast.makeText(getApplicationContext(), "MainActivityObserverCalled", Toast.LENGTH_LONG).show(); } });
MainViewModel 代码
public class MainViewModel extends ViewModel { public MutableLiveData<String> responseval; private LoginRepositry loginRepositry; public MainViewModel(){ loginRepositry = new LoginRepositry(); responseval = loginRepositry.getData("username","password"); } public MutableLiveData<String> getResponseval() { return responseval; } }
LoginRepositry 代码
public class LoginRepositry { private MutableLiveData<String> data = new MutableLiveData<>(); public MutableLiveData<String> getData(String username , String userpass) { new Handler().postDelayed(new Runnable() { @Override public void run() { data.setValue("Login Repo Set Value"); } }, 5000); return data; } }
问题1:return语句的作用是什么,是否仅为满足方法返回类型要求?
当然不止是满足类型要求!这里的return data返回的是MutableLiveData这个「带通知功能的容器实例」,而非当时的空数据。
你可以把LiveData类比成一个「共享消息盒子」:
- 调用
getData时,这个盒子已经被实例化了(private MutableLiveData<String> data = new MutableLiveData<>();),只是暂时是空的; - return的是这个盒子的引用,ViewModel和后续的Activity拿到的都是同一个盒子;
- 5秒后
data.setValue(...)是往这个已经被各方持有的盒子里塞数据,只要盒子内容更新,所有盯着它的观察者(也就是Activity里的Observer)都会立刻收到通知。
如果没有这个return,ViewModel就拿不到这个盒子的入口,Activity自然也没法订阅它的变化了。
问题2:ViewModel中未使用observe,却能传递数据给Activity?
ViewModel根本不需要observe,它只是个「传递盒子的中间人」而已:
- Repository创建了LiveData盒子,把它交给ViewModel;
- ViewModel把同一个盒子的引用转交给Activity;
- Activity给这个盒子注册了观察者(调用
observe方法); - 当Repository往盒子里塞数据时,盒子本身会主动通知所有注册过的观察者——也就是Activity里的
onChanged方法被触发,全程不需要ViewModel在中间“监听”什么。
简单说:LiveData的通知机制是容器自身负责的,只要持有同一个盒子实例,不管哪一层调用setValue,所有订阅这个盒子的观察者都会收到更新,ViewModel只是持有盒子的引用,不需要额外做监听操作。
内容的提问来源于stack exchange,提问作者dev90
相关产品推荐
相关产品推荐

