2017-02-08 26 views
0

ПроблемаClone дооснащения объект 2 Ответ в перехватчик

Я хочу использовать пользовательский перехватчик, чтобы поймать данные перед отправкой в ​​onResponse в коде. Это мой Interceptor код:

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; 
     } 
    } 

Так как я знаю, что только может получить доступ только один раз в ответ после chain.proceed, я хочу, чтобы клонировать этот ответ, поэтому я могу получить доступ и процесс более чем 1 раз с этим ответом. Поэтому я использовал

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

Но когда я запускаю в режиме отладки, этот код работать более чем 1 раз.

Первый раз, result возвращает правильные данные JSON. После завершения строки отладки до return savedResponse; она снова запускается в Response savedResponse = response.newBuilder().build(); и savedResponse.isSuccessful() return success, но result возвращает пустую строку.

Как это исправить? Благодарю.

ответ

0

Необходимо создать пользовательские обратные вызовы.

Пользовательского ответ 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); 
    } 
} 

Реализация

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

      } 

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

      } 
     }); 
+0

Можете ли вы объяснить, больше? Где мне нужен обратный вызов и куда вводить код? Потому что я думаю, что код внутри перехватчика последовательно. – TruongHieu

+0

Почему вы хотите обработать ответ более одного раза? –

+0

Извините. Я думаю, что я описываю проблему не чистую. Является ли программа более 1, а не то, что я хочу, сэр. Он запускается несколько раз и со второго раза, он возвращает пустую строку. – TruongHieu