метод наблюдения против наблюдателя‹›

Я читал документацию по 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 находится во фрагменте. Может ли это быть причиной того, что наблюдение реализовано в двухэтапном и одноэтапном процессе?

Один лучше другого? или это эквивалентные способы их написания?


person FernandoH-G    schedule 14.05.2020    source источник


Ответы (1)


Практическая разница между ними очень мала. Это просто вопрос синтаксиса.

В первом примере код использует new Observer<String>() для создания нового экземпляра объекта, реализующего интерфейс Observer. Этот экземпляр передается observe().

Второй пример на самом деле делает почти то же самое, за исключением того, что он использует Java 8 лямбда-синтаксиса, чтобы свернуть большую часть кода, используемого для определения объекта Observer, и просто определить новый объект Observer, встроенный в вызов observe(), даже не дав ему имя.

Независимо от того, используете ли вы синтаксис new Observer() или лямбда, конечный результат в основном одинаков — создается и передается новый экземпляр Observer.

person Doug Stevenson    schedule 14.05.2020