gpt4 book ai didi

android - 我们应该使用 lambda 还是匿名类来观察 LiveData

转载 作者:行者123 更新时间:2023-12-01 22:19:15 25 4
gpt4 key购买 nike

我意识到,当使用 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);
}
});
});

lambda

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 实例。你只会得到

Observer 3 : 123
<小时/>

Android 指南没有具体提及此类问题。我想知道,我们应该使用匿名类还是Lambda来观察LiveData

最佳答案

最好不要在每次单击按钮时创建新的观察者。相反,将其从点击回调中取出并将其放入您的 Activity/Fragment 初始化代码中。例如,输入您的 onCreate您的 Activity 的方法。

@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设计模式,那么你应该调用mainRepository.incrementCounter();在您的ViewModel内。

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

(并回答您的最终问题:您使用匿名还是 lambda 确实不应该重要,尽管 lambda 更漂亮 - 进行我上面提到的更改应该可以解决您的主要问题不过)

关于android - 我们应该使用 lambda 还是匿名类来观察 LiveData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49597973/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com