0

0

0

修罗

站点介绍

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

封装网络请求框架(三)封装处理请求

修罗 2023-01-26 559 0条评论 安卓

首页 / 正文

之前请求需要实现这几个方法,我们可以封装一个Observer,实现统一响应处理

1690037731310.png

编写适配器,由其他类继承这个适配器,就不用每次创建都实现接口的所有方法

public class ObserverAdapter<T> implements Observer<T> {
    @Override
    public void onSubscribe(@NonNull Disposable d) {

    }

    @Override
    public void onNext(T o) {

    }

    @Override
    public void onError(@NonNull Throwable e) {

    }

    @Override
    public void onComplete() {

    }
}

HttpObserver统一处理响应

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

    /**
     * 请求成功
     *
     * @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(){

    }

    /**
     * 网络请求是否成功了
     *
     * @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;
            }

        // 业务相关,BaseResponse是业务代码
        } 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 {
            // 框架处理错误,比如弹出提示等等
        }

    }
}

之前的请求修改:

1690038160689.png

重写onFailed并返回true,框架就不会自动处理错误,虽然目前还没有做自动处理。

1690038221852.png

HttpObserver自动处理错误

1690038302991.png

评论(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