android - 改造进度条

标签 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);
 }

我只想要一个通用的进度条,用于两种方法,一旦成功和失败就必须取消

最佳答案

你首先要做的是使接口(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/

相关文章:

android - InputMethodManager 关键字未在 Android 应用程序中定义

java - 如何将数据从 Recyclerview 传递到 Fragment

java - 从 Retrofit 加载数据问题 : Expected BEGIN_ARRAY but was BEGIN_OBJECT

android - rxjava : be notified when multiple observables have completed

java - Android + Retrofit 2 + GSON = 无法为接口(interface)调用无参数构造函数

android - 从 Android 应用程序中的 xml/csv 文件读取数据

android - android中的自定义tabview

Android滚动整个屏幕而不仅仅是 ListView

android - 在 Android 上使用 Retrofit 时出现 Vimeo SSL 错误

android - Retrofit 2 调用失败 - 抽象方法 "void okhttp3.Callback.onResponse"