4

我遵循了这个例子,一个集成的ViewModelLiveData.

我习惯于交流LiveData,习惯于交流ViewModelRepositoryactivityViewModel

我想澄清这个问题的困惑很少。

这工作正常,并在 MainActivity 5 秒后显示 Toast 消息。

主要活动

    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();
        }
    });

主视图模型

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;
    }       

登录存储库

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;
    }

这是我的2个问题。

  • 现在使用每种方法,我都返回了一些类型LiveData的数据,但是在返回数据时,没有设置值。我是5秒后设置data.setValue("SomeValue")的,那么return 这里有什么用,是不是因为方法返回类型的原因,万一发生什么都不做LiveData

  • MainActivity,我习惯于homeViewModel.getResponseval().observe 观察数据,但在ViewModel,我没有使用observe,但 ViewModel 仍在观察,Repository并且 5 秒后 MainActivity 得到结果。我无法理解这里发生了什么。

4

1 回答 1

3

所以让我们分部分来做:

现在,对于每种方法,我都返回了一些 LiveData 类型的数据,但是在返回数据时,没有设置该值。我在5秒后设置了data.setValue("SomeValue"), 那么这里return有什么用呢,是不是因为方法返回类型的关系,LiveData的情况下什么都不做

如果您查看文档,您会看到 LiveData “是一个可观察的数据持有者类”,因此它保存数据并且您可以观察它。这对于理解为什么要在此处返回此 LiveData 对象非常重要。通过返回它,您是在告诉架构的下一层(ViewModel)“嘿,这是这个持有者,我会在某个时候将一些数据放在这里,所以如果你想接收数据,请观察它”。

ViewModel 不会观察它,而只是将它传递给对这个数据持有者感兴趣的下一个实体,即 UI ( LifeCycleOwner)。因此,在所有者中,您开始观察这个“数据持有者”,并在新数据到达时收到警告。

在 MainActivity 中,我使用 homeViewModel.getResponseval().observe 观察数据,但在 ViewModel 中,我没有使用observe,但 ViewModel 仍在观察 Repository,5 秒后 MainActivity 得到结果。我无法理解这里发生了什么。

您需要 aLifeCycleOwner来观察来自 a 的更新LiveData,也来自文档:“LiveData如果观察者的生命周期处于 STARTED 或 RESUMED 状态,则认为观察者(由 Observer 类表示)处于活动状态。LiveData 仅通知活动观察者关于更新。” 为了检测状态,它需要一个LifeCycleOwner,这就是为什么当你有作为参数observe传递的方法时。this这就是为什么你没有observeViewModel.

于 2018-05-21T11:53:46.787 回答