AndroidAndroid开发经验谈Android开发

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

2017-09-25  本文已影响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 跟着谷歌混饭吃。

上一篇 下一篇

猜你喜欢

热点阅读