你想要做的第一件事就是讓接口調用正確的,它應該是方法的常見進度(截至翻新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的版本並沒有給我們太多的功能,成爲一等公民。
我的問題是,對於我們需要處理進度條可見性的每個服務? –
@RajaJawahar對於每個服務,沒有。對於每次撥打服務,是的。您不希望自己的服務知道關於用戶界面的擔憂,因爲實施者需要弄清楚。你可以做的事情就是包裝調用,以便更容易操作UI和調用。 – Justin
@RajaJawahar增加了一個包裝它的例子,使它不那麼繁瑣。 – Justin