改进可观察的返回数据

时间:2016-11-23 12:02:58

标签: android rest retrofit observable rx-android

这是与rx android observable一起使用改造的正确方法:

在服务中:

    @GET("/users/{userId}/contacts")
    Observable<Response<List<Contact>>> getContactsForUser(@Path("userId") int userId);

在通话活动中:

 Subscriber<Response<List<Contact>>>  subscriber = new Subscriber<Response<List<Contact>>>() {
    @Override
    public void onCompleted() {

    }

    @Override
    public void onError(Throwable throwable) {
        isLoading.set(false);
        hasError.set(true);
        ProblemReporter.Report(throwable);
    }

    @Override
    public void onNext(Response<List< Contact >> listResponse) {
        isLoading.set(false);
        if (listResponse.isSuccessful())
        {
            hasError.set(false);
            List<Contact> list = listResponse.body();
            showList()
        }
        else
        {
            showError();
        }
    }
};
... 
 subscription = peopleService.getContactsForUser(Credentials.getLoggedUser().getId())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeOn(application.subscribeScheduler())
                .subscribe(subscriber);

或者我应该这样称呼它:

    @GET("/users/{userId}/contacts")
    Observable<List<Contact>> getContactsForUser(@Path("userId") int userId);

没有响应,即没有检查isSuccessful()onComplete,假设如果没有错误就会调用onComplete? 通常的方法是什么?

2 个答案:

答案 0 :(得分:1)

这是正确的方法:

@GET("/users/{userId}/contacts")
Observable<List<Contact>> getContactsForUser(@Path("userId") int userId);

//

Subscriber<List<Contact>>  subscriber = new Subscriber<List<Contact>>() {
@Override
public void onCompleted() {

}

@Override
public void onError(Throwable throwable) {
    isLoading.set(false);
    hasError.set(true);
    ProblemReporter.Report(throwable);
}

@Override
public void onNext(List< Contact > listResponse) {
    isLoading.set(false);
    if (listResponse.isSuccessful())
    {
        hasError.set(false);
        List<Contact> list = listResponse.body();
        showList()
    }
    else
    {
        showError();
    }
}

};

答案 1 :(得分:1)

两者都是正确的。您使用的是偏好和您的情况。当您使用Observable<List<Contact>>进行呼叫时,适配器会为您检查isSuccessful(),如果是错误,它会将响应包装在HttpException中。使用Response可以提供更大的灵活性,但除非您想根据特定的响应代码进行一些特殊处理,否则不需要这样做。