我最近研究过Retrofit。我只是在我的项目中实施。我有近20个api。我已经宣布了所有方法,如。
public interface RF_Calls {
@POST(AppConstants.API_EVENTS_BYSTUDENTS)
void getEvents(@Body JsonObject events);
@POST(AppConstants.API_EXAMS_BYSTUDENTS)
void getExamsbyStudents(@Body JsonObject exams);
}
我只想要一个共同的进度条,这两种方法一旦获得成功和失败就必须被解雇
答案 0 :(得分:5)
首先要做的是使接口调用正确,它应该是(从改进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使用的版本并没有给我们太多的功能成为一等公民。