Я читал документацию по Android, связанную с LiveData и ViewModels, и наткнулся на запись, которая меня смутила.
В Обзор LiveData пример кода реализует наблюдатель следующим образом
public class NameActivity extends AppCompatActivity {
private NameViewModel model;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Other code to setup the activity...
// Get the ViewModel.
model = new ViewModelProvider(this).get(NameViewModel.class);
// Create the observer which updates the UI.
final Observer<String> nameObserver = new Observer<String>() {
@Override
public void onChanged(@Nullable final String newName) {
// Update the UI, in this case, a TextView.
nameTextView.setText(newName);
}
};
// Observe the LiveData, passing in this activity as the LifecycleOwner and the observer.
model.getCurrentName().observe(this, nameObserver);
}}
Двухэтапный процесс создания Observer<String>
обновляющего пользовательский интерфейс и .observe
отслеживающего LiveData
тогда как в Обзор ViewModel реализация наблюдателя
public class SharedViewModel extends ViewModel {
private final MutableLiveData<Item> selected = new MutableLiveData<Item>();
public void select(Item item) {
selected.setValue(item);
}
public LiveData<Item> getSelected() {
return selected;
}
}
public class MasterFragment extends Fragment {
private SharedViewModel model;
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
model = new ViewModelProvider(requireActivity()).get(SharedViewModel.class);
itemSelector.setOnClickListener(item -> {
model.select(item);
});
}
}
public class DetailFragment extends Fragment {
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
SharedViewModel model = new ViewModelProvider(requireActivity()).get(SharedViewModel.class);
model.getSelected().observe(getViewLifecycleOwner(), { item ->
// Update the UI.
});
}
}
С одним .observe
. Я провел некоторое тестирование, и похоже, что одиночный .observe
также может обновлять пользовательский интерфейс.
Я также заметил, что Обзор LiveData реализует наблюдение в Activity, а Обзор ViewModel находится во фрагменте. Может ли это быть причиной того, что наблюдение реализовано в двухэтапном и одноэтапном процессе?
Один лучше другого? или это эквивалентные способы их написания?