2016-05-24 19 views
1
處理甚至拋出

我一直都想與未處理的異常時,錯誤的jsonretrofit2.HttpException雖然它在onError的

retrofit2.HttpException: HTTP 404 
         at retrofit2.RxJavaCallAdapterFactory$SimpleCallAdapter$1.call(RxJavaCallAdapterFactory.java:159) 
         at retrofit2.RxJavaCallAdapterFactory$SimpleCallAdapter$1.call(RxJavaCallAdapterFactory.java:154) 
         at rx.internal.operators.OperatorMap$1.onNext(OperatorMap.java:54) 
         at retrofit2.RxJavaCallAdapterFactory$CallOnSubscribe.call(RxJavaCallAdapterFactory.java:109) 
         at retrofit2.RxJavaCallAdapterFactory$CallOnSubscribe.call(RxJavaCallAdapterFactory.java:88) 
         at rx.Observable$2.call(Observable.java:162) 
         at rx.Observable$2.call(Observable.java:154) 
         at rx.Observable$2.call(Observable.java:162) 
         at rx.Observable$2.call(Observable.java:154) 
         .... 

谷歌+的響應在該代碼:

Observable.create(new Observable.OnSubscribe<String>() { 
     @Override 
     public void call(Subscriber<? super String> strSub) { 
      // Getting ID 
      strSub.onNext(AccountUtils.getAccountId(appContext)); 
      strSub.onCompleted();}) 

      .subscribeOn(Schedulers.io()) 
      // Get Google+ Image through Retrofit2 
      .flatMap(str -> createGPlusUserObservable(str, AccountUtils.ANDROID_API_KEY)) 
      .map(this::setprofileImage) // I don't see Timber.d message inside that method! 
      .compose(binder) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(subscriber); 

在createGPlusUserObservable我使用Retrofit 2以獲得谷歌形象

private Observable<GPlusUser> createGPlusUserObservable(String userId, String apiKey) { 
    //try { 
    GoogleApiService service = ServiceFactory.getInstance().createJsonRetrofitService(
      GoogleApiService.class, 
      GoogleApiService.SERVICE_ENDPOINT 
    ); 

    Observable<GPlusUser> result = service.getGPlusUserInfo(userId, apiKey); 
    Timber.d("Here1!"); // I see that in console! 
    return result; // It always returns result! 
    /*} catch (Throwable e) { - it doesn't catch anything! 
     Timber.d("Here!"); 
    }*/ 
} 

而訂戶是:

new Subscriber<GPlusUser>() { 
     @Override 
     public void onCompleted() { 
      Timber.d("GPlusUserSubscriber ON COMPLETED"); 
     } 

     @Override 
     public void onError(Throwable e) { 
      if (e instanceof HttpException) { 
       Timber.d("RETROFIT!"); // I see that in console! 
      } 
     } 

     @Override 
     public void onNext(GPlusUser gPlusUser) { 
      setupAccountBox(); 
     } 
    }; 

UPDATE:setprofileImage方法

private GPlusUser setprofileImage(GPlusUser gPlusUser) { 
    Timber.d("FOUR"); // As I've said, it doesn't appear in console 
    AccountUtils.setProfileImage(appContext, gPlusUser.image.url); 
    Timber.d("Setting profile image: %s", gPlusUser.image.url); 
    return gPlusUser; 
} 

所以,問題是 - 爲什麼我收到未處理的異常,如果我在訂戶的onError(Throwable的E)

由於處理它!

+0

你能張貼'setprofileImage'的代碼? – JohnWowUs

+0

查看UPDATE。謝謝! – blinker

回答

0

我認爲這是因爲錯誤發生在翻新工廠邏輯,而從純HTML字符串轉換到我的GPlusUser類。

我已經消除,在控制檯日誌惱人的例外通過Observable<Response<ResponseBody>> response與純HTML的工作,它的response.isSuccess()