2017-02-08 3 views
0

ProblemClone Retrofit 2 Response-Objekt in Interceptor

Ich möchte Benutzerdefinierte Interceptor verwenden, um Daten zu fangen, bevor es zu onResponse in Code sendet. Das ist mein Interceptor Code:

public Response intercept(Chain chain) throws IOException { 
     Request request = chain.request(); 

     try { 
      Response response = chain.proceed(request); 
      Response savedResponse = response.newBuilder().build(); 

      if (savedResponse.isSuccessful()){ 
       String result = savedResponse.body().string(); 
       ApiInterceptor apiInterceptor = new Gson().fromJson(result, ApiInterceptor.class); 

       Log.i("hieu", ""); 
       if (activity != null){ 
        if (apiInterceptor.getApi_result() != null){ 
         if (apiInterceptor.getApi_result().getMainte() == AppConstants.MAINTENANCE_CODE){ 
          // show maintenance activity 
         }else{ 
          if (apiInterceptor.getApi_result().getTransfer_status() == AppConstants.TRANSFERING_CODE){ 
           // hien thi man hinh chuyen doi 

          }else{ 
           if (apiInterceptor.getApi_result().getOnly_payment_status() == AppConstants.ONLY_PAYMENT_CODE){ 
            // hien thi man hinh qua han 
           }else{ 
            if (apiInterceptor.getApi_result().getResult() != 0){ 
             showMessage(apiInterceptor.getApi_result().getMessage()); 
            }else{ 
             // normal 
            } 
           } 
          } 
         } 
        } 
       } 

      }else{ 
       showMessage(savedResponse.message()); 
      } 

      return savedResponse; 
     }catch (Exception e){ 
      LogUtils.d(SettingInterceptor.this.getClass().getName(), e.getMessage()); 
      if (activity != null) 
       showMessage(activity.getString(R.string.network_error)); 
      throw e; 
     } 
    } 

Da ich weiß, dass ich nur nur 1 Zeit bis zum Ansprechen nach chain.proceed zugreifen, ich mag, dass die Antwort klonen, so kann ich auf und verarbeiten mehr als 1 Mal mit dieser Antwort. So habe ich

Response savedResponse = response.newBuilder().build();

Aber wenn ich auf den Debug-Modus laufen, dieser Code mehr als 1 Mal ausgeführt.

Zum ersten Mal, result kehrt richtige JSON-Daten. Nach dem Debug-Zeile wieder bei Response savedResponse = response.newBuilder().build(); und savedResponse.isSuccessful() return success begann laufen zu return savedResponse; laufen, aber result leeren String zurück.

Wie es zu beheben? Vielen Dank.

Antwort

0

Sie müssen benutzerdefinierte Rückrufe erstellen.

Individuelle Antwort Interceptor

public abstract class CustomCallbacks implements Callback { 

    public abstract void onCustomResponse(Call call, Response response); 

    public abstract void onCustomFailure(Call call, Throwable response); 

    @Override 
    public void onResponse(Call call, Response response) { 
     //TODO: process response here 
     if(response.isSuccessful()) { 
      onCustomResponse(call, response); 
     }else{ 
      onCustomFailure(call, new Exception("request failed")); 
     } 
    } 

    @Override 
    public void onFailure(Call call, Throwable t) { 
     onCustomFailure(call, t); 
    } 
} 

Implementierung

call.enqueue(new CustomCallbacks() { 
      @Override 
      public void onCustomResponse(Call call, Response response) { 

      } 

      @Override 
      public void onCustomFailure(Call call, Throwable response) { 

      } 
     }); 
+0

Können Sie mehr erklären? Wofür brauche ich einen Rückruf und wo kann ich meinen Code einfügen? Weil ich denke, Code im Interceptor ist sequentiell. – TruongHieu

+0

Warum möchten Sie die Antwort mehr als 1 Mal verarbeiten? –

+0

Entschuldigung. Ich denke ich beschreibe das Problem nicht rein. Ist Programm mehr als 1, nicht was ich will, Herr. Es läuft mehrere Male und ab dem 2. Mal gibt es eine leere Zeichenfolge zurück. – TruongHieu