2016-01-22 64 views
4

我最近研究了Retrofit。我只是在我的項目中實施。我有近20加api。我已經宣佈了所有的方法。Retrofit ProgressBar

public interface RF_Calls { 

    @POST(AppConstants.API_EVENTS_BYSTUDENTS) 
    void getEvents(@Body JsonObject events); 

    @POST(AppConstants.API_EXAMS_BYSTUDENTS) 
    void getExamsbyStudents(@Body JsonObject exams); 
} 

我只是想爲這兩個具有駁回一旦獲得成功和失敗

回答

4

你想要做的第一件事就是讓接口調用正確的,它應該是方法的常見進度(截至翻新2): Call<object> getEvents(@Body JsonObject events) **

**請注意,object類型參數應替換爲您希望從服務返回的模型。如果你不關心答案,你可以把它作爲我相信的對象。

這將允許進行一個異步調用,你可以給它一個回調:

//This should be in your activity or fragment 
final RF_Calls service = //Create your service; 

Call c = service.getEvents(json); 

[Your progress view].show(); 

c.enqueue(new Callback<object>{ 
    @Override 
    public void onResponse(Response<object>, Retrofit retrofit){ 
     [Your progress view].hide(); 
    } 

    @Override 
    public void onFailure(Throwable t){ 
     [Your progress view].hide(); 
    } 
}); 

進度屏幕是一個UI的關注,所以應該在一個活動或片段,上述活動或處理片段將利用這些服務來獲取所需的數據。


在迴應的意見,一個簡單的解決方案,它包裝的呼籲:

//Defines an interface that we can call into 
public interface Act<T> { 
    void execute(T data); 
} 

//Makes a call to the service and handles the UI manipulation for you 
public static <T> void makeServiceCallWithProgress(Call c, final Act<T> success, final Act<Throwable> failure, final ProgressBar progressBar) { 
    progressBar.setVisibility(View.VISIBLE); 

    c.enqueue(new Callback<T>() { 
     @Override 
     public void onResponse(Response<T> response, Retrofit retrofit) { 
      progressBar.setVisibility(View.GONE); 

      success.execute(response.body()); 
     } 

     @Override 
     public void onFailure(Throwable t) { 
      progressBar.setVisibility(View.GONE); 

      failure.execute(t); 
     } 
    }); 
} 

下面是一個例子用法:

makeServiceCallWithProgress(service.getEvents(json), 
          new Act<MyResponseModel>() { 
           @Override 
           public void execute(MyResponseModel data) { 
            //TODO: Do something! 
           } 
          }, 
          new Act<Throwable>() { 
           @Override 
           public void execute(Throwable data) { 
            //TODO: Do something! 
           } 
          }, 
          progressBar); 

它是不是最漂亮的,但隨後再次,Java Android的版本並沒有給我們太多的功能,成爲一等公民。

+0

我的問題是,對於我們需要處理進度條可見性的每個服務? –

+0

@RajaJawahar對於每個服務,沒有。對於每次撥打服務,是的。您不希望自己的服務知道關於用戶界面的擔憂,因爲實施者需要弄清楚。你可以做的事情就是包裝調用,以便更容易操作UI和調用。 – Justin

+0

@RajaJawahar增加了一個包裝它的例子,使它不那麼繁瑣。 – Justin