gpt4 book ai didi

android - 如何使用 RxJava 和 retrofit 2 从多个 API 获取数据

转载 作者:行者123 更新时间:2023-11-29 02:41:19 25 4
gpt4 key购买 nike

我是 RxJava 的新手。我想从 JSON API 获取数据。假设有两个 API,API 1 和 API 2。我们从 API 1 获取一个 JSON 对象“mediaId”。现在,我想使用“mediaId”从 API 2 获取 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.com05-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())
);
}

Alright there is another way to solve this, first create a observable for both API, then subscribe and observe changes from your first API subscription.Next create a PublishSubject instance. Which is useful because,once an Observer has subscribed, emits all subsequently observed items to the subscriber.For example publish string values from the api response.

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");

优点,可以非常灵活地更改类范围内的任何位置。

希望这对您有所帮助。

对于下面的 fragment

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

}
});

关于android - 如何使用 RxJava 和 retrofit 2 从多个 API 获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43853740/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com