2017-10-14 1 views
0

So habe ich einen sehr einfachen Workflow von RxJava Beobachter Stream, wo ich etwas von Retrofit anfordern, mit erfolgreicher Antwort Toast erfolgreich msg und mit Fehler I toast Fehler msg.onError nicht implementiert Fehler in RxJava2, obwohl seine implementiert

Der Fall, den ich unten beziehe mich ist der Fehlerfall, wo ich Fehler msg von API erwarten, ich habe es in Benutzer lesbare Wörter und Anzeige als Toast konvertieren, wie unten gezeigt, wenn ich doOnNext und doOnError Verfahren auf diese Weise mit Fehler abstürzt erwähnt.

Ich habe auch throwExceptionIfFailure Methode hinzugefügt, die zeigt, wie ich lesbare msg und die Zeile konvertieren, wo die Konsole auf den Fehler zeigt.

registerNFCTag(body) 
       .map(result -> throwExceptionIfFailure(result)) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .doOnNext(result -> { 
        toggleLoaders(true);       
       appToast(getString(R.string.done_msg) + tagName); 
       }) 
       .doOnError(throwable -> { 
        Toasty.error(this, throwable.getLocalizedMessage()).show(); 
        toggleLoaders(true); 
       }) 
       .subscribeOn(Schedulers.io()) 
       .subscribe(); 

Fehler Wenn dies nicht genug ist, kann ich StackTrace auch post.

java.lang.IllegalStateException: Exception thrown on Scheduler.Worker thread. Add `onError` handling. 

ThrowExceptionIfFailure-Methode.

public <T> T throwExceptionIfFailure(T res) { 

    Response result = (Response<?>) res; 
    if (!result.isSuccessful()) { 
     try { 
      String msg = result.errorBody().string(); 
      Log.d(TAG, "throwExceptionIfFailure: "+msg); 
      if (result.code() == 401 || result.code() == 403) { 
       invalidateToken(); 
       msg = context.getString(R.string.invalid_credential); 
      } 
      else if (result.code() == 502) 
       msg = context.getString(R.string.server_down); 
      else if (result.code() == 422) 
       msg = context.getString(R.string.invalid_domain); 
      else if (result.code() == 500) 
       msg = context.getString(R.string.internal_server_error_500_msg); 
      else if (result.code() == 451) 
------><>>>>>> expected error msg works well with the case mentioned below with throwable in subscribe itself. 
       msg = context.getString(R.string.toast_tag_already_registered_error); 

      if (result.code() == 403) 
       throw new TokenException(); 
      else 
------>>>>>below line where console points error     
       throw Exceptions.propagate(new RuntimeException(msg)); 

     } catch (Throwable e) { 
      throw Exceptions.propagate(e); 
     } 
    } else { 
     return res; 
    } 
} 

Aber elbe abonniere ich auf diese Weise und es funktioniert gut, und ich sehe die Fehler msg wie erwartet geröstet.

registerNFCTag(body) 
       .map(result ->throwExceptionIfFailure(result)) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribeOn(Schedulers.io()) 
       .subscribe(
         result -> { 
          toggleLoaders(true); 
          appToast(getString(R.string.done_msg) + tagName); 
         } 
         , throwable -> { 
          Toasty.error(this, throwable.getLocalizedMessage()).show(); 
          toggleLoaders(true); 
         }); 

Noch Anfänger in RxJava2 Welt so, hilf mir, den Unterschied zu verstehen. Vielen Dank im Voraus.

+0

Die Fehlerbehandlung muss im 'subscribe()' als zweites Argument durchgeführt werden. Wenn es nicht vorhanden ist, erhalten Sie eine Benachrichtigung, dass der Fehler nicht behandelt wird. 'doOnError()' ist eigentlich kein Fehlerhandler, trotz der Implikation seines Namens. –

+0

in Ordnung, also im ersten Fall, wie sollte ich Fehler in doOnError() behandeln? –

+0

Warum gefällt Ihnen das Arbeitsbeispiel, das Sie am Ende Ihrer Frage gepostet haben, nicht? Was ist deine Frage speziell? – azizbekian

Antwort

Verwandte Themen