0

0

0

修罗

站点介绍

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

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

修罗 2023-01-29 759 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)


最新评论

  • https://www.studyglobus.com/author/carroll34a5552/

    Ценники на вывоз мусора сейчас космос, любые лайфхаки по экономии в тему.

  • Richardgrold

    1xbet onlayn kazino platforması ilə vaxtınızı daha səmərəli və maraqlı keçirin. Saytın canlı kazino bölməsi istifadəçilərə fərqli bir dünya təklif edir. Burada canlı dilerli kazino oyunlarının hər bir növünü sınaqdan keçirə bilərsiniz. Krupyelərin peşəkarlığı oyunun dinamikasını və marağını artırır. Müntəzəm olaraq yenilənən oyun siyahısı cansıxıcılığa yol vermir. Hesabınızı artırmaq üçün onlarla fərqli və etibarlı üsul mövcuddur. Qazanılan pullar cəmi bir neçə dəqiqə ərzində şəxsi hesabınıza köçürülür. Aktiv fəaliyyətinizə görə fərdi bonuslar və hədiyyələr qazana bilərsiniz. Dəstək xidməti həm çat, həm də e-poçt vasitəsilə kömək göstərir. 1xbet ailəsinə qoşulun və böyük uduşlar üçün ilk addımı atın. onlayn kazino

  • 砂岩白丘

    我一直梦想, 看到你们相册那样的地方。真棒。

  • 城市地標

    我喜欢, 这里分享真实经验。你的项目 就是 属于这里的。请继续。

  • 宗教地標

    我热爱这样的想法, 去那么多国家。真的很鼓舞。

  • 觀景高地

    能感受到热爱。继续保持 感受。

  • 最佳季節

    我关注这样的资源, 写得很实在。你的网站 就是 属于这里的。加油。

  • 1

    1

  • 1

    1

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

    1

日历

2026年07月

   1234
567891011
12131415161718
19202122232425
262728293031 

文章目录

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