簡體   English   中英

如何使用帶有翻新版2的RxJava從多個API中獲取數據

[英]How to fetch data from multiple APIs using RxJava with retrofit 2

我是RxJava的新手。 我想從JSON API獲取數據。 假設有兩個API,API 1和API2。我們從API 1獲取JSON對象“ mediaId”。現在,我想從API 2中使用“ mediaId”獲取JSON。 如何使用RxJava以及Android中的改裝來實現這一目標?

public void gettdata(final Listerner listerner){

    postitemses= new ArrayList<>();
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("https://www.mytrendin.com")
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
            .build();

    APiService networkAPI = retrofit.create(APiService.class);

    Observable<List<Postitems>> observable = networkAPI.getFriendObservable()
                                     .subscribeOn(Schedulers.newThread())
                                     .observeOn(AndroidSchedulers.mainThread());

    observable.subscribe(new Observer<List<Postitems>>() {
        @Override
        public void onCompleted() {

        }

        @Override
        public void onError(Throwable e) {

            listerner.onFailure("oops... Something went wrong");
        }

        @Override
        public void onNext(List<Postitems> postitemsList1) {

            Postitems postitems;
            for (int i=0;i<postitemsList1.size();i++){
                postitems = new Postitems();
                int id = postitemsList1.get(i).getId();
                String title = postitemsList1.get(i).getTitle().getRendered();
                String shortdesc= postitemsList1.get(i).getExcerpt().getRendered();
                String mediaid= postitemsList1.get(i).getFeatured_media();
                String authorid= postitemsList1.get(i).getAuthor();
                String date = postitemsList1.get(i).getDate();
                String slug = postitemsList1.get(i).getSlug();
                Log.i("Hello-slug",""+slug);
                String[] mediaurl= mydata(mediaid);
                Log.i("Hello-mediaurl",""+mediaurl);
                postitems.setId(id);
                postitems.setDate(date);
                postitems.setSlug(""+slug);
                postitems.setPostExcerpt(shortdesc);
                postitems.setPostTitle(title);
                postitemses.add(postitems);

            }
            listerner.showpostitems(postitemses);

        }
    });


}




public String[] mydata(String mediaid){


    final String[] mediaurl = new String[1];
    Retrofit retrofit = new Retrofit.Builder()
            .addConverterFactory(GsonConverterFactory.create())
            .baseUrl("https://www.mytrendin.com")
            .build();
    APiService aPiService = retrofit.create(APiService.class);
    Call<Postitems> call = aPiService.getmediaurl(mediaid);
    call.enqueue(new Callback<Postitems>() {
        @Override
        public void onResponse(Call<Postitems> call, Response<Postitems> response) {

            Postitems postitemsList1 = response.body();
            mediaurl[0] =postitemsList1.getGuid().getRendered();
           // mediaurl[0][0] =postitemsList1.get(0).getGuid().getRendered();
        }

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

        }
    });

    return mediaurl;

}

發生了錯誤

https://www.mytrendin.com 05-09 03:42:09.227 15315-15315 /? D / AndroidRuntime:關閉VM

                                           --------- beginning of crash

05-09 03:42:09.228 15315-15315 /? E / AndroidRuntime:致命例外:主進程:com.mytrendin.mytrendin,PID:15315 java.lang.NullPointerException:嘗試調用虛擬方法.mytrendin.dashboard.utils.Po stitems $ Guid(ZygoteInit.java:755)

確保可以將合並運算符與IO調度程序一起使用。根據定義,合並可以通過合並它們的發射將多個Observable合並為一個。

Observable<Integer> odds = Observable.just(1, 3, 5).subscribeOn(someScheduler);
Observable<Integer> evens = Observable.just(2, 4, 6);

Observable.merge(odds, evens)
          .subscribe(new Subscriber<Integer>() {
        @Override
        public void onNext(Integer item) {
            System.out.println("Next: " + item);
        }

        @Override
        public void onError(Throwable error) {
            System.err.println("Error: " + error.getMessage());
        }

        @Override
        public void onCompleted() {
            System.out.println("Sequence complete.");
        }
    });

輸出:

下一個:1

下一個:3

下一個:5

下一個:2

下一個:4

下一條:6

序列完成。

在您的情況下,

public Observable<Data> getMergedData() {
  return Observable.merge(
    networkRepository.getData().subscribeOn(Schedulers.io()),
    networkRepository.getData().subscribeOn(Schedulers.io())
  );
}

好的,還有另一種解決方法,首先為這兩個API創建一個可觀察對象,然后訂閱並觀察您的第一個API訂閱中的更改。接下來創建一個PublishSubject實例。 這很有用,因為觀察者一旦訂閱,就會向訂閱者發出所有隨后觀察到的項。例如,從api響應中發布字符串值。

private PublishSubject<String> subject = PublishSubject.create();


subject.observeOn(AndroidSchedulers.mainThread()).subscribeOn(Schedulers.io()).filter((s) -> s.size() > 0).subscribe(new Observer<String>() {
            @Override
            public void onSubscribe(Disposable d) {

            }

            @Override
            public void onNext(String str) {


            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onComplete() {

            }
        });

然后觸發可觀察對象的onNext呼叫。

subject.onNext("some data from api");

優點,非常靈活,可以在您的班級范圍內的任何地方進行更改。

希望這可以幫助。

對於以下代碼段

  call.enqueue(new Callback<Postitems>() {
        @Override
        public void onResponse(Call<Postitems> call, Response<Postitems> response) {

            Postitems postitemsList1 = response.body();
            mediaurl[0] =postitemsList1.getGuid().getRendered();
           // mediaurl[0][0] =postitemsList1.get(0).getGuid().getRendered();
//use the concept of publish subject here, which i detailed in answer, example
subject.onNext(postitemsList1.getGuid().getRendered());
//the string data will be passed to the above observable for the subject instance.
        }

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

        }
    });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM