MVVM с RxJava без привязки данных

После прочтения множества статей о MVVM и RxJava мне нужно реализовать простейшую демку, чтобы хорошо уловить идею без использования DataBinding

Но я застрял в том, как ViewModel будет уведомлять View (Activity) со списком данных

Моя ViewModel содержит fetchGitHub(), которая таким образом использует RxJava

io.reactivex.Observable<List<Repo>> reposReturnedObservable = githubClient.reposForUser(user);

    reposReturnedObservable
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Observer<List<Repo>>() {
                @Override
                public void onError(Throwable e) {

                }

                @Override
                public void onComplete() {

                }

                @Override
                public void onSubscribe(Disposable d) {
                    compositeDisposable.add(d);
                }

                @Override
                public void onNext(List<Repo> repos) {
                    data = repos;
                }
            });

Каких строк здесь не хватает, чтобы обновить представление данными

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    viewModel = new ViewModel();
    viewModel.fetchGitHub("square");

}

person Tony George    schedule 25.01.2019    source источник


Ответы (1)


fetchGitHub() должен вернуть Observable, чтобы Activity мог на него подписаться.

ViewModel:

public class ViewModel {

    public Observable<List<Repo>> fetchGitHub(String userName) {
        return githubClient.reposForUser(user);
    }
}

Мероприятия:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    TextView listSizeTextView = findViewById(R.id.listSizeTextView);

    viewModel = new ViewModel();
    viewModel.fetchGitHub("square")
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(list -> listSizeTextView.setText("list size: " + list.size()));
}

В приведенном выше примере подписка не хранится, чтобы предоставить вам упрощенный ответ, но на практике убедитесь, что подписки удалены, как в вашем примере.

person Sanlok Lee    schedule 26.01.2019
comment
Спасибо, именно этого мне и не хватало - person Tony George; 30.01.2019