Какая польза от оператора return при использовании с LiveData - PullRequest
0 голосов
/ 21 мая 2018

Я следовал этому примеру, интегрировал ViewModel и LiveData.

Я использовал LiveData для ViewModel до Repository связи и activity до ViewModel связи

У меня мало смущений, что я хочу прояснить этот вопрос.

Это работает нормально, и через 5 секунд на MainActivity отображается сообщение Toast.

MainActivity

    MainViewModel homeViewModel = ViewModelProviders.of(this).get(MainViewModel.class);

    homeViewModel.getResponseval().observe(this, new Observer<String>() {
        @Override
        public void onChanged(@Nullable String s) {
            Toast.makeText(getApplicationContext(), "MainActivityObserverCalled", Toast.LENGTH_LONG).show();
        }
    });

MainViewModel

public class MainViewModel extends ViewModel {

    public MutableLiveData<String> responseval;
    private LoginRepositry loginRepositry;

    public MainViewModel(){
        loginRepositry = new LoginRepositry();
        responseval = loginRepositry.getData("username","password");
    }


    public MutableLiveData<String> getResponseval() {
        return responseval;
    }       

LoginRepositry

public class LoginRepositry {

    private MutableLiveData<String> data = new MutableLiveData<>();

    public  MutableLiveData<String> getData(String username , String userpass) {

        new Handler().postDelayed(new Runnable() {

            @Override
            public void run() {
                data.setValue("Login Repo Set Value");

            }
        }, 5000);

        return data;
    }

Это мои 2 вопроса.

  • Теперь с каждым методом явозвращая некоторые данные типа LiveData, но во время возврата данных значение не устанавливается.Я установил его через 5 секунд data.setValue("SomeValue"), так что толку от return здесь, это только из-за типа возвращаемого метода и ничего не делает в случае LiveData

  • В MainActivity я использовал homeViewModel.getResponseval().observe для данных наблюдателя, но в ViewModel я не использовал observe, но ViewModel все еще наблюдает Repository и через 5 секунд MainActivity получает результат.Я не могу понять, что здесь происходит.

1 Ответ

0 голосов
/ 21 мая 2018

Итак, давайте сделаем это по частям:

Теперь с каждым методом я возвращаю некоторые данные типа LiveData, но во время возврата данных значение не устанавливается.Я устанавливаю его через 5 секунд data.setValue ("SomeValue"), так что толку от возврата здесь, это только из-за типа возврата метода, и ничего не делает в случае LiveData

Есливы проверите docs и увидите, что LiveData "является наблюдаемым классом держателя данных", поэтому он хранит данные, и вы можете наблюдать их.Это очень важно понять, почему вы возвращаете этот объект LiveData здесь.Возвращая его, вы сообщаете следующему слою вашей архитектуры (ViewModel): «Эй, вот этот держатель, я в какой-то момент положу здесь некоторые данные, поэтому наблюдатель , если вы хотите получитьданные".

ViewModel не наблюдает за этим, а просто передает его следующему объекту, заинтересованному в этом держателе данных, пользовательскому интерфейсу (LifeCycleOwner).Таким образом, в владельце вы начинаете наблюдать за этим «держателем данных» и будете предупреждены, когда поступят новые данные.

В MainActivity я использовал homeViewModel.getResponseval (). Наблюдаю за данными наблюдателя, но вViewModel, я не использовал наблюдение, но ViewModel все еще наблюдает за репозиторием, и через 5 секунд MainActivity получает результат.Я не могу понять, что здесь происходит.

Вам необходим LifeCycleOwner, чтобы наблюдать обновления от LiveData, также из документов: "LiveData считает наблюдателя, который являетсяпредставленный классом Observer, чтобы быть в активном состоянии, если его жизненный цикл находится в состоянии STARTED или RESUMED. LiveData только уведомляет активных наблюдателей об обновлениях. "Для определения состояния требуется LifeCycleOwner, поэтому, когда у вас есть метод observe, вы передаете this в качестве параметра.И именно поэтому вы не использовали observe в ViewModel.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...