基于okHttpUtils网络请求的基类抽取

来源:互联网 发布:js判断字符串不等于 编辑:程序博客网 时间:2024/04/28 03:50

二次封装的功能

1,网络的get请求2,Xml数据解析

封装后,子类只需要实现的步骤

1,实现getUrl方法,提供一个请求的url地址2,选择性实现getParamsMap方法,提供一个请求参数的map集合,因为部分可能不需要参数3,子类继承基类的时候,基类要声明泛型的具体类型

为什么要进行基类的抽取

1,因为后期网络请求的地方比较多2,减少代码量3,结构更加清晰

抽取需要修改的地方处理

1,每个网络请求的URL地址不一样,抽取一个抽象方法,子类必须实现2,每个网络请求的参数不一样,抽取一个方法,子类选择性实现,因为有的请求可能没有参数3,接口中,参数的类型不一样,使用泛型RESTYPE,使用泛型

注意事项

1,不知道怎么抽取的就先不用管,使其可以继承2,在基类中不可以具体实现的,抽取一个方法交给子类实现3,不确定的类型,使用泛型,泛型使用必须在该类或者接口中声明,如果其他地方调用该类或者接口,也必须使用泛型    注意,在子类中,如果用到该类或者接口要进行泛型的声明

代码

/** * Author:      归零 * Date:        2017/3/4 9:31 * Email:       4994766@qq.com * Description:网络请求和数据的转换的基类 * 需要改变的地方 * 1,NewsPagerProtocol.Callback  改为 BaseProtocol * 2,参数不确定,提供一个方法 子类必须实现 * 3,Url不确定,提供一个方法,子类必须实现 * 4,泛型的改变 *      1,将要改变的类型,变为泛型 *          1,使用泛型后要在类或者接口中声明泛型 *          2,在类或者接口使用的地址,添加泛型 *          3,在使用的类或者接口声明泛型 *      2, */public abstract class BaseProtocol<RESTYPE> {    protected int mCurrentPageIndex;    public void setCurrentPageIndex(int currentPageIndex) {        mCurrentPageIndex = currentPageIndex;    }    public void loadData(final BaseProtocol.Callback<RESTYPE> callback) {        //决定请求的网络地址        String newsUrl = getUrl();        //http://www.oschina.net/action/api/news_list?pageIndex=0&catalog=1&pageSize=20        //网络请求        OkHttpUtils                .get()                .url(newsUrl)                .params(getParamsMap())                .build()                .execute(new StringCallback() {                    @Override                    public void onError(Call call, Exception e, int id) {                        //因为返回失败处理的请求不一样,所以不处理,交给调用的方法处理                        callback.onError(call, e, id);                    }                    @Override                    public void onResponse(String response, int id) {                        //基类里面通过一定的方式获取子类传递的类型                        //请求成功,将字符串转为javaBean,并获取里面的泛型为News的集合                        Type type = BaseProtocol.this.getClass().getGenericSuperclass();                        ParameterizedType parameterizedType = (ParameterizedType) type;                        Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();                        Type typeArgument = actualTypeArguments[0];                        RESTYPE  restype = (RESTYPE) XmlUtils.toBean((Class)typeArgument, response.getBytes());                        //将转换后的数据通过接口回调,返回给调用方法的                        callback.onResponse(restype, id);                    }                });    }    /**     * 决定请求的url     * 在BaseProtocol中不知道具体的实现 交给子类     * 子类必须实现,定义成为抽象方法     * @return     */    protected abstract String getUrl() ;    /**     * 决定请求的参数     * 在BaseProtocol中不知道具体的实现 交给子类实现     * 子类必须实现 定义成抽象方法     * @return     */    public HashMap<String,String> getParamsMap(){        return null;    };    public interface Callback<RESTYPE> {        void onError(Call call, Exception e, int id);        void onResponse(RESTYPE restype, int id);    }}
0 0
原创粉丝点击