我们是否应该使用lambda或匿名类观察Livedata



我意识到使用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 classLambda观察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 - 我在上面提到的更改应该清除您的主要问题不过(

相关内容

  • 没有找到相关文章