RxJava подписки onNext не вызывается при асинхронном добавлении элемента - PullRequest
0 голосов
/ 08 декабря 2018

У меня есть Observable, как этот

Observable<String> gitHubRepoModelObservable;

У меня есть этот код

repoNames = new ArrayList<String>();

        gitHubRepoModelObservable = Observable.fromIterable(repoNames);

        repoNames.add("Hello");

        gitHubRepoModelObservable
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<String>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }

                    @Override
                    public void onNext(String s) {
                        System.out.println(s);
                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onComplete() {

                    }
                });

repoNames - это просто список строк.Когда я добавляю строку «привет» вручную, вызывается onNext, но когда я добавляю строку из вызова API, как показано ниже

 call.enqueue(new Callback<List<GitHubRepoModel>>() {
            @Override
            public void onResponse(Call<List<GitHubRepoModel>> call, Response<List<GitHubRepoModel>> response) {
                for (GitHubRepoModel repo : response.body()) {
                    repoNames.add(repo.getName());
                }
            }

            @Override
            public void onFailure(Call<List<GitHubRepoModel>> call, Throwable t) {

            }
        });

, я добавляю строки из API в repoNames «onNext»не вызывается.

Я видел, что

.addCallAdapterFactory(RxJava2CallAdapterFactory.create())

можно добавить при инициализации модификации, но я хочу лучше понять rxjava, поэтому в этом эксперименте он не работает.

Пожалуйста, помогите!

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018

Это не может быть работой.Когда вы создаете свой API-запрос и пытаетесь подписаться, ваш список пуст, поэтому Observable не работает.Вам нужно создать Observable таким, чтобы ваш подписчик запустил ваш запрос!

  Observable<String> gitHubRepoModelObservable = Observable.create(
                    new Observable.OnSubscribe<String>() {

                        @Override
                        public void call(final Subscriber<? super String> sub) {

                            call.enqueue(new Callback<List<GitHubRepoModel>>() {

                                @Override
                                public void onResponse(Call<List<GitHubRepoModel>> call, Response<List<GitHubRepoModel>> response) {

                                    for (GitHubRepoModel repo : response.body()) {

                                        sub.onNext(repo.getName()); //send result to rx
                                    }
                                    sub.onCompleted();
                                }

                                @Override
                                public void onFailure(Call<List<GitHubRepoModel>> call, Throwable t) {

                                }
                            });
                        }
                    }
            );


gitHubRepoModelObservable
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<String>() {

                    @Override
                    public void onNext(String s) {
                        System.out.println(s);
                    }

                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {

                    }


                });
0 голосов
/ 08 декабря 2018

Зачем вызывать onNext, если вы просто добавляете элемент в обычный список?В первом примере вы видите, как вызывается onNext, потому что измененный список передается через поток во время subscribe.Создать Subject отл.PublishSubject и пропустите список на Subject.onNext в onResponse, подпишитесь на него, и вы получите то, что хотите.

Второй вариант добавляет RxJava2CallAdapterFactory и возвращает Observable<Response<List<GithubRepoModel>>>.Таким образом, вам не нужно создавать поток самостоятельно.

...