首页 > 解决方案 > 如何管理视图模型

问题描述

我有一个具有视图模型的活动。当我调用该视图模型的 2 个方法时,首先执行第二个方法。为什么?

我该如何管理这些方法?

这是活动的 onCreate:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_news_letter);

    dbViewModel = new ViewModelProvider(this).get(DBViewModel.class);

    dbViewModel.getLastUpdate().observe(this, s -> {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
        try {
            Date date = format.parse(s);
            timeStamp = (int)date.getTime() / 1000;
            getAllNews(BaseCodeClass.CompanyID, timeStamp);
        } catch (ParseException e) {
            e.printStackTrace();
        }
    });

    dbViewModel.getAllNews().observe(this, newsLetters ->
    {
        Toast.makeText(this, "3", Toast.LENGTH_SHORT).show();
    });

} 

在此方法中,首先执行 dbViewModel.getAllNews(),然后执行 dbViewModel.getLastUpdate()

标签: androidandroid-viewmodelandroid-mvvm

解决方案


当您观察 aLiveData时,它会在数据准备好或数据更改时调用onChanged其观察者的方法。当你LiveData以一定的顺序观察两个或多个 s 时,并不意味着观察者也会按照这个顺序被调用。它会在数据准备好时发生。这正是像LiveData.

如果您想以确切的顺序仅读取一次这些值,则可以立即调用getValue()并获取该值,而不是观察它们:

String s = dbViewModel.getLastUpdate().getValue();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
try {
    Date date = format.parse(s);
    timeStamp = (int)date.getTime() / 1000;
    getAllNews(BaseCodeClass.CompanyID, timeStamp);
} catch (ParseException e) {
    e.printStackTrace();
}

var newsLetters = dbViewModel.getAllNews().getValue();
Toast.makeText(this, "3", Toast.LENGTH_SHORT).show();

LiveData这些值将按该顺序读取,但如果值更改,则不会再次调用它们。


推荐阅读