异步添加元素时未调用RxJava subscription onNext

时间:2018-12-07 23:18:55

标签: retrofit2 rx-java2

我有一个这样的Observable

    mydata
      name  value
      <chr>  <dbl>
    1 jd        20
    2 mk        30
    3 js        40

    readable_strings <- c("John Smith" = "js", "Jane Do" = "jd", "Mike Tyson" = "mt")
    ggplot(mydata, aes(x = name, y=value)) + geom_bar(stat="identity")

我有此代码

Observable<String> gitHubRepoModelObservable;

repoNames只是一个字符串列表。当我手动添加字符串“ hello”时,onNext会被调用,但是当我从类似于波纹管的API调用中添加字符串时

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() {

                    }
                });

我正在将API中的字符串添加到未调用“ onNext”的repoNames中。

我见过

 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) {

            }
        });
可以在初始化改造时添加

,但是我想更好地了解rxjava,因此在本实验中它不起作用。

请帮助!

2 个答案:

答案 0 :(得分:1)

如果仅将元素添加到普通列表,为什么会onNext被调用? 在第一个示例中,您看到onNext被调用,因为修改后的列表在subscribe期间通过流传递。 创建Subject例如。 PublishSubject并将列表传递到Subject.onNext中的onResponse,进行订阅,您将得到想要的东西。

第二个选项是添加RxJava2CallAdapterFactory并返回Observable<Response<List<GithubRepoModel>>>。这样,您就无需自己创建流。

答案 1 :(得分:1)

这是行不通的。 创建api请求并尝试订阅时,列表为emty,因此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) {

                    }


                });