改造ProgressBar

时间:2016-01-22 14:46:13

标签: android retrofit

我最近研究过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);
 }

我只想要一个共同的进度条,这两种方法一旦获得成功和失败就必须被解雇

1 个答案:

答案 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使用的版本并没有给我们太多的功能成为一等公民。