0

0

0

修罗

站点介绍

只有了解事实才能获得真正的自由

封装网络请求框架(五)请求加载中

修罗 2023-01-29 558 0条评论 安卓

首页 / 正文

HttpObserver

请求请加载提示

自定义加载动画DialogFragment

@Override
public void onSubscribe(Disposable d) {
    super.onSubscribe(d);
    if(isShowLoading){
        activity.showLoading();
    }
}

请求结束关闭提示

public void onEnd(){
    if(isShowLoading){
        activity.hideLoading();
    }
}

我们需要在类中保存acitivity实例,还需要定义一个是否显示弹框的变量

private boolean isShowLoading;
private BaseLogicActivity activity;

BaseLogicActivity 是自定义的activity基类

创建实例的方法

/**
     * 构造方法
     * @param activity
     */
public HttpObserver(BaseLogicActivity activity) {
    super();
    this.activity = activity;
}

/**
     * 构造方法
     * @param activity
     */
public HttpObserver(BaseLogicActivity activity, boolean isShowLoading) {
    super();
    this.activity = activity;
    this.isShowLoading = isShowLoading;
}

/**
    fragment调用
*/
public HttpObserver(BaseLogicFragment fragment) {
    super();
    this.activity = (BaseLogicActivity) fragment.getActivity();
    this.isShowLoading = true;
}

使用

在activity中

1690102497992.png

HttpObserver完整代码

/**
 * 网络请求Observer
 */
public abstract class HttpObserver <T> extends ObserverAdapter<T> {
    private static final String TAG = "HttpObserver";
    private boolean isShowLoading;
    private BaseLogicActivity activity;

    /**
     * 构造方法
     * @param activity
     */
    public HttpObserver(BaseLogicActivity activity) {
        super();
        this.activity = activity;
    }

    /**
     * 构造方法
     * @param activity
     */
    public HttpObserver(BaseLogicActivity activity, boolean isShowLoading) {
        super();
        this.activity = activity;
        this.isShowLoading = isShowLoading;
    }

    public HttpObserver(BaseLogicFragment fragment) {
        super();
        this.activity = (BaseLogicActivity) fragment.getActivity();
        this.isShowLoading = true;
    }

    /**
     * 请求成功
     *
     * @param data
     */
    public abstract void onSucceeded(T data);

    /**
     * 请求失败
     *
     * @param data
     * @param e
     * @return true:自己处理;false:框架处理
     */
    public boolean onFailed(T data, Throwable e) {

        return false;
    }

    @Override
    public void onError(Throwable e) {
        super.onError(e);
        onEnd();

        //处理错误
        handlerRequest(null, e);
    }

    @Override
    public void onNext(T t) {
        super.onNext(t);

        onEnd();
        Log.d(TAG, "onNext: "+t);
        if (isSucceeded(t)) {
            //请求正常
            onSucceeded(t);
        } else {
            //请求出错了
            handlerRequest(t, null);
        }
    }

    /**
     * 请求结束,成功失败都会调用(调用前调用),使用在这里隐藏加载提示
     */
    public void onEnd(){
        if(isShowLoading){
            activity.hideLoading();
        }
    }

    @Override
    public void onSubscribe(Disposable d) {
        super.onSubscribe(d);
        if(isShowLoading){
            activity.showLoading();
        }


    }

    /**
     * 网络请求是否成功了
     *
     * @param t
     * @return
     */
    private boolean isSucceeded(T t) {
        if (t instanceof Response) {
            //retrofit里面的响应对象

            //获取响应对象
            Response response = (Response) t;

            //获取响应码
            int code = response.code();

            //判断响应码
            if (code >= 200 && code <= 299) {
                //网络请求正常
                return true;
            }

        } else if (t instanceof BaseResponse) {
            //判断具体的业务请求是否成功
            BaseResponse response = (BaseResponse) t;

            return response.isSucceeded();
        }

        return false;
    }

    /**
     * 处理错误网络请求
     *
     * @param data
     * @param error
     */
    private void handlerRequest(T data, Throwable error) {
        if (onFailed(data, error)) {
            //回调了请求失败方法
            //并且该方法返回了true
            //返回true就表示外部手动处理错误
            //那我们框架内部就不用做任何事情了

        } else {
            // 框架处理错误,比如弹出提示等等
            HandleExceptionUtil.handlerRequest(data, error);
        }

    }
}

评论(0)


最新评论

  • 1

    1

  • 1

    1

  • -1' OR 2+158-158-1=0+0+0+1 or 'TKCTZnRa'='

    1

  • 1

    1

  • 1

    1

  • 1

    1

  • 1

    1

  • @@5Qa2D

    1

  • 1

    1

  • 1

    1

日历

2025年09月

 123456
78910111213
14151617181920
21222324252627
282930    

文章目录

推荐关键字: Linux webpack js 算法 MongoDB laravel JAVA jquery javase redis