Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 改进ProgressBar_Android_Retrofit - Fatal编程技术网

Android 改进ProgressBar

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

我最近研究了改装。我只是在我的项目中实施。我有将近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);
 }

我只想为这两种方法提供一个通用的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