美文网首页AndroidAndroid开发经验谈Android开发
Android开发架构模型(三)泛型类、接口的使用及实战案例

Android开发架构模型(三)泛型类、接口的使用及实战案例

作者: 任珉豪 | 来源:发表于2017-09-25 17:27 被阅读128次
    前方高能

    什么是泛型

    泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。

    泛型的作用

    比如大家常用的 ArrayList等,通过注入相应的参数,可承载不同的类和对象,当类型不匹配时会报错,某种程度上提高了编码的安全性。

    学习的目的

    泛型的使用不仅使你的应用提高了安全性,同时能够减少代码的编码量,使你的代码更加简洁、规范。

    泛型有哪些使用技巧

    泛型接口、类,泛型函数,Class<T>,泛型数组,类型绑定,通配符等。

    泛型类与接口的使用

    使用场景一:MVP结构中基类的使用,下面以自己开发MVP基础框架为例子,MVP模型不清楚的请移步Android标准式MVP架构模型(无内存泄漏、M层可复用),里面有使用方法及项目源码。

    下面看下BasePresenter的代码

      public class BasePresenter <V>  {
    public BaseMvpActivity mContext;
    
    public BasePresenter(BaseMvpActivity context) {
        mContext = context;
    }
    
    protected Reference<V> mViewRef;
    
    public void attachView(V view) {
        mViewRef = new WeakReference<V>(view);
    }
    
    public boolean isViewAttached() {
        return mViewRef != null && mViewRef.get() != null;
    }
    
    public void detachView() {
        if (mViewRef != null) {
            mViewRef.clear();
            mViewRef = null;
        }
    }
    
    public V getView() {
        return mViewRef != null ? mViewRef.get() : null;
    }
      }
    

    这里的BasePresenter <V>就是一个泛型类。

    看下使用时的代码。

      public class GSYPlayerPresenter extends BasePresenter<IGSYPlayerActivity>
    

    继承的时候会传入一个对象,这个对象是 V层实现的接口,在BasePresenter中主要是将这个类弱引用化。

    通过泛型类,就可实现一定的封装性,可根据传入的参数进行定制化。

    使用场景二:可以封装网络层,比如网络返回的Json字符串,通常是要转化成对应的对象,那么我们可以对网络做二次封装,通过传入相应的对象,让网络层直接返回我们想要的对象,而不是返回字符串再每个接口去做转对象的操作。

    先看下使用效果:

      loginRequest.buildGateway(true).requestGateway(new HttpRequestListener<HotTopicMapper>() {
            @Override
            public void onHttpSuccessResponse(String statusCode, HotTopicMapper result) {
                callBack.success(result);
            }
    
            @Override
            public void onHttpErrorResponse(String exceptionCode, String errorMsg) {
                callBack.error(errorMsg);
            }
        },HotTopicMapper.class);
    

    接口IOC回调onHttpSuccessResponse方法,返回的就是我们要的对象。

    如果不用泛型是什么呢?

      loginRequest.buildGateway().requestGateway(new HttpRequestListener() {
            @Override
            public void onHttpSuccessResponse(String statusCode, Object result) {
                HotTopicMapper Mapper = (HotTopicMapper) result;
                callBack.success(Mapper);
            }
    
            @Override
            public void onHttpErrorResponse(String exceptionCode, String errorMsg) {
                callBack.error(errorMsg);
            }
        }, HotTopicMapper.class);
    

    可看到onHttpSuccessResponse方法IOC回调中,每次都要强转成自己想要的类型,是不是没有上面的优雅。

    看下HttpRequestListener类的定义。

      public interface HttpRequestListener<T> {
    void onHttpSuccessResponse(String statusCode, T result);
    void onHttpErrorResponse(String exceptionCode, String errorMsg);
    }
    

    这实际上就是自定义的 泛型接口

    总结:泛型掌握好是必须的,使用熟练会在编码上提升很高的层次,可加群 136705426 跟着谷歌混饭吃。

    相关文章

      网友评论

        本文标题:Android开发架构模型(三)泛型类、接口的使用及实战案例

        本文链接:https://www.haomeiwen.com/subject/bzddextx.html