1,基本概念
为什么使用泛型
泛型的本质便是类型参数化,通俗的说就是用一个变量来表示类型,这个类型可以是String,Integer等等不确定,表明可接受的类型,
泛型最长用于集合如set,map list,Threadlocal AtomicReference 尽量使用泛型
对于有限制的类型通配符 可用 PECS作为帮助记忆
PECS表示:producer-extends ,Consumer-supper
如果参数化类型是一个T生产者,就使用<? extends T>
如果参数化类型是一个T消费者,就使用<? super T>
如例子:
public String getSomething();
public void setConfig(String sth);
}
public interface GerOpera<T> {
public T getSomething();
public void setConfig(T sth);
}
2,在mvp中的使用
public interface BaseViewI<V> {
/**
* 数据加载失败
* tag==1,正常错误,可以只显示toast
* tag=0,非正常错误,需要考虑显示错误界面
* */
void showDataError(String errorMessage, int tag);
/**
*数据加载成功
* */
void showDataSuccess(V datas);
/**
* 显示加载进度
* */
void showProgress();
/**
* 显示加载进度
* */
void hideProgress();
/**
* 点击重新加载
* */
void onReload();
/**
* 显示加载中视图
* */
void showLoadingView();
/**
* 显示无网络视图
* */
void showNetErrorView();
/**
* 没有加载到内容
* */
void showEmptyView(String msg);
/**
* 显示内容View
* */
void showContent();
}
public interface BasePresenterI {
/**
* 判断网络连接
* */
boolean checkNetWork(Context context);
void unsubcrible();
}
public class BasePresenter<V extends BaseViewI> implements BasePresenterI {
public V mView;
public Context context;
private CompositeSubscription mCompositeSubscription;
@Override
public boolean checkNetWork(Context context) {
if(!NetUtil.isNetworkAvailable()) {
ToastShow.getInstance(context).toastShow("网络不给力");
}
return NetUtil.isNetworkAvailable();
}
public void attachView(V view,Context context) {
this.mView = view;
this.context=context;
}
/**
* 事件订阅
* */
public void addSubscription(Subscription s) {
if (this.mCompositeSubscription == null) {
this.mCompositeSubscription = new CompositeSubscription();
}
this.mCompositeSubscription.add(s);
}
/**
* 取消事件订阅
* */
@Override
public void unsubcrible() {
if (this.mCompositeSubscription != null) {
this.mCompositeSubscription.unsubscribe();
}
mView=null;
context=null;
this.mCompositeSubscription=null;
}
}
在Fragment可这样使用
public abstract class BaseFragment<T extends BasePresenterI,V> extends Fragment implements BaseViewI<V>{}
在Activity中可这样使用
public abstract class BaseActivity<T extends BasePresenterI, V> extends AutoLayoutActivity implements BaseViewI<V> {}
如下面的例子所示
具体的fragment实现
public class DemoFragment extends BaseFragment<HomePresenter, List<BrandBean>> implements HomeContract.View {}
具体的Activiy实现
public abstract class BaseActivity<T extends BasePresenterI, V> extends Activity implements BaseViewI<V>{}