Android 改进ProgressBar
我最近研究了改装。我只是在我的项目中实施。我有将近20多个api。我已经声明了所有类似的方法Android 改进ProgressBar,android,retrofit,Android,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 Jso
public interface RF_Calls {
@POST(AppConstants.API_EVENTS_BYSTUDENTS)
void getEvents(@Body JsonObject events);
@POST(AppConstants.API_EXAMS_BYSTUDENTS)
void getExamsbyStudents(@Body JsonObject exams);
}
我只想为这两种方法提供一个通用的progressbar,一旦它成功或失败就必须取消它首先要做的是使接口调用正确,它应该是(从改型2开始):
调用getEvents(@Body JsonObject events)
**
**请注意,对象
类型参数应替换为期望从服务返回的模型。如果你不在乎对方的反应,我相信你可以把它当作目标
这将允许进行异步调用,您可以对其进行回调:
//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();
}
});
//这应该在您的活动或片段中
final RF_Calls service=//创建您的服务;
调用c=service.getEvents(json);
[您的进度视图].show();
c、 排队(新回调){
@凌驾
公共响应(响应、改装){
[您的进度视图].hide();
}
@凌驾
失效时的公共无效(可丢弃的t){
[您的进度视图].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);
}
});
}
//定义一个我们可以调用的接口
公共接口法{
无效执行(T数据);
}
//调用服务并为您处理UI操作
public static void makeServiceCallWithProgress(调用c、最后一幕成功、最后一幕失败、最后一幕进度栏ProgressBar){
progressBar.setVisibility(View.VISIBLE);
c、 排队(新回调(){
@凌驾
公共响应(响应、改装){
progressBar.setVisibility(View.GONE);
success.execute(response.body());
}
@凌驾
失效时的公共无效(可丢弃的t){
progressBar.setVisibility(View.GONE);
失败。执行(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);
makeServiceCallWithProgress(service.getEvents(json)),
新法案(){
@凌驾
public void execute(MyResponseModel数据){
//托多:做点什么!
}
},
新法案(){
@凌驾
public void execute(可丢弃数据){
//托多:做点什么!
}
},
进度条);
它不是最漂亮的,但同样,Java Android使用的版本并没有给我们提供很多功能,让我们成为一流公民。我的问题是,对于每个服务,我们需要单独处理进度条可见性???@RajaJawahar,对于每个服务,不。对于每个服务调用,是的。您不希望您的服务了解UI关注点,这些关注点应由实现者来解决。您可以做的事情是包装调用,使其更易于操作UI和调用。@RajaJawahar添加了一个包装的示例,使其不那么麻烦。非常感谢@Justin