我们应该使用 lambda 还是匿名 class 来观察 LiveData

Should we use lambda or anonymous class to observe LiveData

我意识到在使用 lambda 和匿名 class 观察时存在显着差异 LiveData

匿名class

button.setOnClickListener(e -> {
    mainViewModel.getCounter().observe(MainFragment.this, new Observer<Integer>() {
        @Override
        public void onChanged(@Nullable Integer counter) {
            android.util.Log.i("CHEOK", "Observer 3 : " + counter + ", " + this);
        }
    });
});

拉姆达

button.setOnClickListener(e -> {
    mainViewModel.getCounter().observe(MainFragment.this, counter -> {
        android.util.Log.i("CHEOK", "Observer 3 : " + counter);
    });
});

当您多次点击按钮时,对于匿名 class,将创建多个不同的观察实例,并传递给 LiveData。因此,如果你按下按钮 3 次,然后执行

counter.postValue(counter.getValue());

你会得到

Observer 3 : 123, com.xxx.MainFragment@cd023a
Observer 3 : 123, com.xxx.MainFragment@beb52e1
Observer 3 : 123, com.xxx.MainFragment@d1ffcf4

但是对于 lamda,即使你多次按下按钮,也只会创建一个 Observer 实例。你只会得到

Observer 3 : 123

Android 指南没有特别提到这样的问题。我在想,我们应该使用 Anonymous class 还是 Lambda 来观察 LiveData

最好不要在每次单击按钮时都创建新的观察者。而是将其从点击回调中取出并将其放入您的 Activity / 片段初始化代码中。例如,进入 Activity.

onCreate 方法
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    mainViewModel.getCounter().observe(MainFragment.this, new Observer<Integer>() {
        @Override
        public void onChanged(@Nullable Integer counter) {
            android.util.Log.i("CHEOK", "Observer 3 : " + counter + ", " + this);
        }
    });
}

然后要增加计数器,您需要告诉 ViewModel 数据应该更改。在你的情况下 mainViewModel.incrementCounter();。如果您还使用 Repository 设计模式,那么您应该在 ViewModel 中调用 mainRepository.incrementCounter();

此时,您可以访问 MutableLiveData<Integer> 实例并增加它。使用 postValue(...) 方法通常是个好主意,因为它会通过主线程发送更新。这对 UI 更新很重要。

(并回答你的 end-question:你使用匿名还是 lambda 真的不应该 重要 ,尽管 lambda 只是更漂亮 - 进行我提到的更改以上应该解决了你的主要问题)