我们应该使用 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 只是更漂亮 - 进行我提到的更改以上应该解决了你的主要问题)
我意识到在使用 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 只是更漂亮 - 进行我提到的更改以上应该解决了你的主要问题)