我意识到使用lambda和匿名类观察LiveData
匿名类
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);
}
});
});
lamda
button.setOnClickListener(e -> {
mainViewModel.getCounter().observe(MainFragment.this, counter -> {
android.util.Log.i("CHEOK", "Observer 3 : " + counter);
});
});
当您多次单击按钮时,对于匿名类,将创建多个不同的观察实例,并将其传递给LiveData
。因此,如果按下按钮3次,并执行
counter.postValue(counter.getValue());
您会得到
Observer 3 : 123, com.xxx.MainFragment$1@cd023a
Observer 3 : 123, com.xxx.MainFragment$1@beb52e1
Observer 3 : 123, com.xxx.MainFragment$1@d1ffcf4
但对于lamda,即使您多次按下按钮,也只会创建一个观察者实例。您只会得到
Observer 3 : 123
Android指南并未具体提及此类捕获。我想知道,我们是否应该使用Anonymous class
或Lambda
观察LiveData
?
最好不要在每个按钮点击时不创建新的观察者。而是将其从单击回调中取出,然后将其放入您的活动/片段初始化代码中。例如,进入活动的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();
。如果您还使用存储库设计模式,则应在ViewModel
中调用mainRepository.incrementCounter();
。
此时,您可以访问MutableLiveData<Integer>
实例,然后将其递增。使用postValue(...)
方法通常是一个好主意,因为这将通过主线程发送更新。这对于UI更新很重要。
(要回答您的最终问题:尽管Lambdas只是更漂亮,但实际上不应该 Wite 是否使用匿名或lambdas - 我在上面提到的更改应该清除您的主要问题不过(