如何管理视图模型

How to manage viewmodel

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

我如何管理这些方法?

这是 activity 的 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()

当您观察一个 LiveData 时,它会在数据准备好或数据更改时调用其观察者的 onChanged 方法。当您按特定顺序观察两个或多个 LiveData 时,并不意味着观察者也将按该顺序被调用。它会在数据准备好时发生。这正是 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 值更改,则不会再次调用它们。