Retrofit2 및 RxJava 사용 시 오류 처리

2929 단어
Retrofit와 RxJava를 함께 사용할 때 Retrofit 객체를 구축할 때 다음과 같은 문구를 추가합니다.
addCallAdapterFactory(RxJavaCallAdapterFactory.create())

이렇게 하면 우리는 서비스의 방법에서observable 대상을 얻을 수 있다.
public interface MyService {
    @GET("user/me")
    Observable getUser();
}

사실 RxJavaCallAdapterFactory는 RxJava를 사용하여 observables를 만들 때 세 가지 다른 Observable 매개 변수 설정을 지원합니다.
4
  • Observable, body를 직접 사용합니다.응답 코드가 2XX인 경우 OnNext 메서드에서 직접 반서열화된 Body를 반환합니다.2XX가 아닌 해당 코드는 onError 방법에서 HttpException으로, 네트워크 오류는 OnError 방법에서 IOException으로 표시됩니다

  • 4
  • Observable>, Response 패키지 body를 사용합니다.모든 Http가 요청한 응답체는 OnNext 방법에서 받을 수 있습니다. 응답 코드가 2XX이든 아니든 상관없습니다.네트워크 오류는 OnError 메서드에서 IOException으로 표시됩니다

  • 4
  • Observable > Result 패키지 바디를 사용합니다.모든 Http 요청 응답체와 네트워크 오류는 OnNext 메서드에 있습니다

  • 현재 서버에서 되돌아오는 데이터 형식은 대부분 다음과 같기 때문이다.
    {
      "code":"",
      "message":"",
      "data":{
    
      }
    }
    

    "code"는 서버에서 클라이언트와 약속한 사용자 정의 오류 코드입니다. "메시지"는 오류 정보입니다. "data"에 있는 것이야말로 진정한 업무 논리 데이터입니다.
    이 경우 다음과 같이 Body Response 클래스를 정의하여 이러한 데이터 유형에 대응해야 합니다.
    public class BodyResponse {
      private String code;
      private String message;
      private T data;
    
      //getter and setter
    }
    

    만약 데이터 안의 데이터가 목록이라면 다음 두 가지 방법을 사용하면observable는Observable>>> 또는Observable>>>>로 쓰일 것입니다. 여러분의 기분이 어떠신지 모르겠지만, 어쨌든 저는 전체가 안 좋은 것 같습니다.그래서 나는 첫 번째 문법을 사용할 것이다. 이것도 대부분의 사람들의 문법이라고 믿는다.
    그러면 첫 번째 방식을 사용하면 Observable은 Observable > 이라고 쓰입니다.그러면 응답 코드가 2XX가 아닌 상황에서 onError 방법에서 오류 처리를 할 수 있습니다.
    observer
    .subscribe(new Subscriber() {
                                @Override
                                public void onCompleted() {
                                }
    
                                @Override
                                public void onError(Throwable throwable) {
                                    BodyResponse errBody = ErrorHandler.handle(throwable);
                                    // do something with code or message
                                }
    
                                @Override
                                public void onNext(User user) {
    
                                }
                            });
    

    ErrorHandler
    public class ErrorHandler {
    
        public static BodyResponse handle(Throwable throwable) {
            if (throwable instanceof HttpException) {
                HttpException error = (HttpException) throwable;
                try {
                    return new Gson().fromJson(error.response().errorBody().string(),
                            BodyResponse.class);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            } else {
                throwable.printStackTrace();
            }
            return null;
        }
    }
    

    아주 편리하죠, 아주 간단하죠?

    좋은 웹페이지 즐겨찾기