最近在研究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);
}
我只想要一个通用的进度条,用于两种方法,一旦成功和失败就必须取消
最佳答案
你首先要做的是使接口(interface)调用正确,它应该是(从改造 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 问题,因此它应该在 Activity 或 fragment 中处理,所述 Activity 或 fragment 将利用服务来获取所需的数据。
作为对评论的回应,一个包装调用的简单解决方案:
//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);
它不是最漂亮的,但话又说回来,Android 使用的 Java 版本并没有给我们提供太多功能,让我们成为一等公民。
关于android - 改造进度条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34949395/