接触到MVP模式已经挺长时间了,好几个月前T-MVP我就看到了,觉得挺有想法的,从中加入了retrofit+RxJava希望能懂。于是直接就用到了这次项目里,希望能够喜欢!
大家都知道MVP模式都有的几个接口Model,View,Presenter,另外还有一个用于用于存放这几个接口Contract契约类。
本文建议对mvp有所了解的人看 说的不详细希望见解 本人就是喜欢存储 以便来日看看!
首先自定义一个契约类后面必须以Contract结束!
先加一个网络缓存的工具类
public class MyRxCache { private static volatile MyRxCache myRxCache; private Cache ch; private static OkHttpClient build; private MyRxCache() { } public OkHttpClient build(Context context) { return getCache(context); } public static MyRxCache Builder() { if (null == myRxCache) { synchronized (MyRxCache.class) { if (null == myRxCache) { myRxCache = new MyRxCache(); } } } return myRxCache; } private OkHttpClient getCache(Context context) { final Cache ch = new Cache(new File(context.getCacheDir(), "ch"), 10240 * 1024); return new OkHttpClient.Builder().cache(ch).addInterceptor(new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Request build = chain.request().newBuilder().cacheControl(new CacheControl.Builder().maxStale(2, TimeUnit.HOURS).build()).build(); return chain.proceed(build); } }).build(); }
ApiServer类
public interface ApiServer { @GET Observable<MeiTuBean> getMeiTu(@Url String url); @GET Observable<XinWenBean> getXinWen(@Url String url); @FormUrlEncoded @POST("affsdfsdf") Observable<XinWenBean> ggetpostxinwen(@FieldMap Map<String,String> map); }
Conarict Url地址类
public class Conarict { public static final String URL="http://c.m.163.com/nc/article/headline/T1348647909107/0-20.html"; public static final String BASEURL="http://c.m.163.com/nc/article/headline/T1348647909107/"; public static final String MEITUURL="http://gank.io/api/data/%E7%A6%8F%E5%88%A9/20/1"; public static final String MEITUBASEURL="http://gank.io/api/data/%E7%A6%8F%E5%88%A9/20/"; public static final String XINWENURL="http://v.juhe.cn/toutiao/index? type=top&key=d7ebf452b17acbf198dfcf7c24d4c6f9"; }
HomeContract类
Context 是一个网络缓存 public class HomeContract { public interface View extends BaseView { //一次网络请求写一个方法 void MeiTu(MeiTuBean meiTuBean); void XinWen(XinWenBean xinWenBean); //POST请求 void PostXinWen(XinWenBean xinWenBean); } public interface Model extends BaseModel { rx.Observable<MeiTuBean> getMMeiTu(String url, Context context); rx.Observable<XinWenBean> getMXinWen(String url, Context context); rx.Observable<XinWenBean> getPostMXinWen(Map<String,String> map, Context context); } public abstract static class Presenter extends BasePresenter<Model, View> { public abstract void getPMeiTu(String url,Context context); public abstract void getPXinWen(String url,Context context); public abstract void getPostPXinWen(Map<String,String> map,Context context); } }
BaseView类
public interface BaseView { //请求失败返回的方法 void Shi(String string); }
BaseModel类 public interface BaseModel { //Get请求加网络缓存 ApiServer getBasemodel(Context context); //POST ApiServer getPostBasemodel(Context context,String baseurl); }
HomeModel类
public class HomeModel implements HomeContract.Model { //GET @Override public ApiServer getBasemodel(Context context) { return new Retrofit.Builder() .client(MyRxCache.Builder().build(context)) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .baseUrl(Conarict.MEITUBASEURL) .build().create(ApiServer.class); } //POST @Override public ApiServer getPostBasemodel(Context context,String baseurl) { return new Retrofit.Builder() .client(MyRxCache.Builder().build(context)) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .baseUrl(baseurl) .build().create(ApiServer.class); }//GET @Override public Observable<XinWenBean> getMXinWen(String url, Context context) { return getBasemodel(context) .getXinWen(url); } //POST @Override public Observable<XinWenBean> getPostMXinWen(Map<String, String> map, Context context) { return getPostBasemodel(context,Conarict.BASEURL) .ggetpostxinwen(map); } }
BasePresenter类 public class BasePresenter<M, V> { public M m; public V v; public void setM(M m,V v) { this.m = m; this.v = v; } }
HomePresenter 类 public class HomePresenter extends HomeContract.Presenter { //GET @Override public void getPXinWen(String url, Context context) { m.getMXinWen(url, context).subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer<XinWenBean>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { v.Shi(e.getMessage()); } @Override public void onNext(XinWenBean xinWenBean) { v.XinWen(xinWenBean); } }); } //POST @Override public void getPostPXinWen(Map<String, String> map, Context context) { m.getPostMXinWen(map, context).subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer<XinWenBean>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { v.Shi(e.getMessage()); } @Override public void onNext(XinWenBean xinWenBean) { v.PostXinWen(xinWenBean); } }); } }
TUtils工具类 public class TUtils {public static <T> T getT(Object o, int i) { try { return ((Class<T>) ((ParameterizedType) (o.getClass() .getGenericSuperclass())).getActualTypeArguments()[i]) .newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassCastException e) { e.printStackTrace(); } return null; } public static Class<?> forName(String className) { try { return Class.forName(className); } catch (ClassNotFoundException e) { e.printStackTrace(); } return null; } }
BaseActivity类
public abstract class BaseActivity<M extends BaseModel, P extends BasePresenter> extends AppCompatActivity { public M m; public P p; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); m = TUtils.getT(this, 0); p = TUtils.getT(this, 1); if (this instanceof BaseView) { p.setM(m, this); } setContentView(getLayoutId()); initView(); } protected abstract void initView(); protected abstract int getLayoutId(); }
BaseFrament类
public abstract class BaseFrament<M extends BaseModel,P extends BasePresenter> extends Fragment { public M m; public P p; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { m= TUtils.getT(this,0); p= TUtils.getT(this,1); if (this instanceof BaseView){ p.setM(m,this); } return inflater.inflate(getLayoutsId(), container, false); } protected abstract int getLayoutsId(); @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); initView(view); } protected abstract void initView(View view); }
Activity里面
public class MainActivity extends BaseActivity<HomeModel, HomePresenter> implements HomeContract.View{}
Frament里面
public class BlankFragment extends BaseFrament<HomeModel, HomePresenter> implements HomeContract.View {GET就p.getPXinWen(Conarict.XINWENURL,getContext());POST就Map<String, String> map=new HashMap<>(); map.put("stry","10"); map.put("stry","10"); map.put("stry","10"); p.getPostPXinWen(map,getContext());