Rxjava with retrofit - zip() - 如何绕过错误响应

Rxjava with retrofit - zip() - how to bypass an error response

我正在尝试同时请求 3 个服务,并在它们都完成后显示结果。一切正常,直到其中一个请求失败。

public class MainActivity extends AppCompatActivity {

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

    testZip();
}

private void testZip() {
    Retrofit repo = new Retrofit.Builder()
            .baseUrl("https://api.github.com")
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
            .build();

    Observable<JsonObject> userObservable = repo
            .create(GitHubUser.class)
//                .getUser("username")
                .getUser("fakeUser_fakeUser")
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread());

    Observable<JsonArray> eventsObservable = repo
            .create(GitHubEvents.class)
            .listEvents("username")
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread());

    Observable<UserAndEvents> combined = Observable.zip(userObservable, eventsObservable, new Func2<JsonObject, JsonArray, UserAndEvents>() {
        @Override
        public UserAndEvents call(JsonObject jsonObject, JsonArray jsonElements) {
            return new UserAndEvents(jsonObject, jsonElements);
        }
    }).onErrorResumeNext(Observable.<UserAndEvents>empty());

    combined.subscribe(new Subscriber<UserAndEvents>() {
        @Override
        public void onCompleted() {
            Log.wtf("TAG", "onCompleted");
        }

        @Override
        public void onError(Throwable e) {
            Log.wtf("TAG", "onError");
            Log.wtf("TAG", e.toString());
        }

        @Override
        public void onNext(UserAndEvents o) {
            Log.wtf("TAG", "onNext");
            Log.wtf("Username", o.user.get("name").toString());
            Log.wtf("First event", o.events.get(0).getAsJsonObject().get("type").toString());
        }
    });
}



public interface GitHubUser {
    @GET("users/{user}")
    Observable<JsonObject> getUser(@Path("user") String user);
}

public interface GitHubEvents {
    @GET("users/{user}/events")
    Observable<JsonArray> listEvents(@Path("user") String user);
}

public class UserAndEvents {
    public UserAndEvents(JsonObject user, JsonArray events) {
        this.events = events;
        this.user = user;
    }

    public JsonArray events;
    public JsonObject user;
}

}

我这里想要的是即使用户请求失败也能得到“事件”数据。我确实尝试过 onErrorReturn()、onErrorResumeNext()、onExceptionResumeNext(),但它们都在没有数据的情况下转到 onCompleted()。我打算使用 mergeDelayError() 但它要求响应数据相同,这不适合我的应用程序。

onErrorResumeNext 移动到 userObservable,因此 zip 看起来像 Observable<UserAndEvents> combined = Observable.zip(userObservable.onErrorResumeNext(Observable.just(new JsonObject()), eventsObservable,...。如果出现错误,压缩结果将包含用户的空 JsonObject。