个人用起来最舒服的MVP框架

框架使用

关于项目代码中的基础框架搭建
presenter和view的基类中加入了内存的优化
map介绍:
契约:连接M,V,P三层(通过接口实现的方式)
Model:数据的获取(一般是网络请求)
Presenter:代码逻辑的处理
View:控件等的展示

1.设置好你的Apiservice

Apiservice是你一切的基础,如果你需要使用网络请求的话`.

public interface IApi {//登陆注册@POSTObservable<ResponseBody> postMap(@Url String url, @QueryMap Map<String, String> map);//GET复用@GETObservable<ResponseBody> getMap(@Url String url, @QueryMap Map<String, String> map);//delete复用@DELETEObservable<ResponseBody> deleteMap(@Url String url, @QueryMap Map<String, String> map);//文件上传@Multipart@POSTObservable<ResponseBody> filePost(@Url String url, @Query("content") String content, @Part List<MultipartBody.Part> list);//put请求复用@PUTObservable<ResponseBody> putMap(@Url String url, @QueryMap Map<String, String> map);
}

2.设计好你的契约

第二步,设置好你的契约,用来连接三个层

public interface Contract {interface IView<T>{void OnSuccess(T t);void OnError(String error);}//连接p层interface IPresenter{//发送复用void postMap(String url, Map<String, String> map, Class aClass);//获取复用void getMap(String url, Map<String, String> map, Class aClass);//删除复用void deleteMap(String url, Map<String, String> map, Class aClass);//多图上传void filePost(String url,String content, List<MultipartBody.Part>list, Class aClass);//put上传复用void putMap(String url, Map<String, String> map, Class aClass);}
//连接modelinterface IModel{//发送复用void postMap(String url, Map<String, String> map, Class aClass, ModelCallBack callBack);//获取复用void getMap(String url, Map<String, String> map, Class aClass, ModelCallBack callBack);//删除复用void deleteMap(String url, Map<String, String> map, Class aClass, ModelCallBack callBack);//多图上传void filePost(String url,String content, List<MultipartBody.Part>list, Class aClass,ModelCallBack callBack);//put上传复用void putMap(String url, Map<String, String> map, Class aClass,ModelCallBack callBack);}interface ModelCallBack<T>{void OnSuccess(T t);void OnError(String error);}}

3.构建好网络工具类(2/3)

public class MyHttpUtils {//retrofit对象private final Retrofit mretrofit;private IApi miapi;//单例模式(双重锁)private static MyHttpUtils MY_HTTP_UTILS;public static MyHttpUtils getInstance(){if(MY_HTTP_UTILS == null){synchronized (MyHttpUtils.class){if(MY_HTTP_UTILS == null){MY_HTTP_UTILS = new MyHttpUtils();}}}return MY_HTTP_UTILS;}//初始化okpublic MyHttpUtils(){//拦截器HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();//设置interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);//okOkHttpClient okHttpClient = new OkHttpClient.Builder().connectTimeout(5, TimeUnit.SECONDS).writeTimeout(5,TimeUnit.SECONDS).readTimeout(5,TimeUnit.SECONDS).addInterceptor(interceptor).addInterceptor(new HeaderInterceptor()).build();//retrofitmretrofit = new Retrofit.Builder().baseUrl(Constant.BASE_URL).addConverterFactory(GsonConverterFactory.create()).addCallAdapterFactory(RxJava2CallAdapterFactory.create()).client(okHttpClient).build();//结合miapi = mretrofit.create(IApi.class);}//接口public interface NetCallBack<T>{void onSuccess(T t);void onError(String error);}//网络判断public static boolean isNetWork(Context context){//系统ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);//网络NetworkInfo networkInfo = manager.getActiveNetworkInfo();if (networkInfo!=null){return networkInfo.isAvailable();}return false;}//头参class HeaderInterceptor implements Interceptor {@Overridepublic Response intercept(Chain chain) throws IOException {//sp存储SharedPreferences user = MyApplication.context.getSharedPreferences("user", Context.MODE_PRIVATE);//取两个参数String userId = user.getString("userId","");String sessionId = user.getString("sessionId","");
//            Log.i("头参",userId+"分割"+sessionId);//创建请求Request build = chain.request();Request request = build.newBuilder().addHeader("userId",userId).addHeader("sessionId",sessionId).addHeader("ak","0110010010000").build();return chain.proceed(request);}}////登陆注册等复用public void PostMap(String url, Map<String,String>map, final Class aClass, final NetCallBack netCallBack){miapi.postMap(url,map).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer<ResponseBody>() {@Overridepublic void onSubscribe(Disposable d) {}@Overridepublic void onNext(ResponseBody responseBody) {Gson gson = new Gson();try {Object o = gson.fromJson(responseBody.string(),aClass);if(netCallBack != null){netCallBack.onSuccess(o);}} catch (IOException e) {e.printStackTrace();}}@Overridepublic void onError(Throwable e) {if(netCallBack != null){netCallBack.onError(e.getMessage());}}@Overridepublic void onComplete() {}});}//get请求复用public void getMap(String url, Map<String,String>map, final Class aClass, final NetCallBack netCallBack){miapi.getMap(url, map).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer<ResponseBody>() {@Overridepublic void onSubscribe(Disposable d) {}@Overridepublic void onNext(ResponseBody responseBody) {Gson gson = new Gson();try {String obj = responseBody.string();Object o = gson.fromJson(obj, aClass);Log.i("信息",obj);if (netCallBack!=null){netCallBack.onSuccess(o);}} catch (IOException e) {e.printStackTrace();}}@Overridepublic void onError(Throwable e) {if (netCallBack!=null){netCallBack.onError(e.getMessage());}}@Overridepublic void onComplete() {}});}

4.IModel

model和p层中通过实现契约中对应的接口做到mvp的逻辑分层

public class IModel implements Contract.IModel {@Overridepublic void postMap(String url, Map<String, String> map, Class aClass, final Contract.ModelCallBack callBack) {MyHttpUtils.getInstance().PostMap(url, map, aClass, new MyHttpUtils.NetCallBack() {@Overridepublic void onSuccess(Object o) {callBack.OnSuccess(o);}@Overridepublic void onError(String error) {callBack.OnError(error);}});}@Overridepublic void getMap(String url, Map<String, String> map, Class aClass, final Contract.ModelCallBack callBack) {MyHttpUtils.getInstance().getMap(url, map, aClass, new MyHttpUtils.NetCallBack() {@Overridepublic void onSuccess(Object o) {callBack.OnSuccess(o);}@Overridepublic void onError(String error) {callBack.OnError(error);}});}@Overridepublic void deleteMap(String url, Map<String, String> map, Class aClass, final Contract.ModelCallBack callBack) {MyHttpUtils.getInstance().deleteMap(url, map, aClass, new MyHttpUtils.NetCallBack() {@Overridepublic void onSuccess(Object o) {callBack.OnSuccess(o);}@Overridepublic void onError(String error) {callBack.OnError(error);}});}@Overridepublic void filePost(String url,String content, List<MultipartBody.Part> list, Class aClass, Contract.ModelCallBack callBack) {MyHttpUtils.getInstance().filePost(url, content, list, aClass, new MyHttpUtils.NetCallBack() {@Overridepublic void onSuccess(Object o) {callBack.OnSuccess(o);}@Overridepublic void onError(String error) {callBack.OnError(error);}});}@Overridepublic void putMap(String url, Map<String, String> map, Class aClass, Contract.ModelCallBack callBack) {MyHttpUtils.getInstance().putMap(url, map, aClass, new MyHttpUtils.NetCallBack() {@Overridepublic void onSuccess(Object o) {callBack.OnSuccess(o);}@Overridepublic void onError(String error) {callBack.OnError(error);}});}
}

5.basepresenter和presenterImpl

public abstract class BasePresenter<V extends Contract.IView> implements Contract.IPresenter {//private IModel iModel;//弱引用private WeakReference<V> vWeakReference;//构造public BasePresenter(){iModel = new IModel();}//绑定public void attachView(V v){if(vWeakReference == null){vWeakReference = new WeakReference<>(v);}}//解绑public void detachView(){if(vWeakReference != null){vWeakReference.clear();vWeakReference = null;}}//getpublic V getView(){return vWeakReference.get();}public IModel getiModel(){return iModel;}}
public class PresenterImpl extends BasePresenter {@Overridepublic void postMap(String url, Map<String, String> map, Class aClass) {getiModel().postMap(url, map, aClass, new Contract.ModelCallBack() {@Overridepublic void OnSuccess(Object o) {getView().OnSuccess(o);}@Overridepublic void OnError(String error) {getView().OnError(error);}});}@Overridepublic void getMap(String url, Map<String, String> map, Class aClass) {getiModel().getMap(url, map, aClass, new Contract.ModelCallBack() {@Overridepublic void OnSuccess(Object o) {getView().OnSuccess(o);}@Overridepublic void OnError(String error) {getView().OnError(error);}});}@Overridepublic void deleteMap(String url, Map<String, String> map, Class aClass) {getiModel().deleteMap(url, map, aClass, new Contract.ModelCallBack() {@Overridepublic void OnSuccess(Object o) {getView().OnSuccess(o);}@Overridepublic void OnError(String error) {getView().OnError(error);}});}@Overridepublic void filePost(String url,String content, List<MultipartBody.Part> list, Class aClass) {getiModel().filePost(url, content, list, aClass, new Contract.ModelCallBack() {@Overridepublic void OnSuccess(Object o) {getView().OnSuccess(o);}@Overridepublic void OnError(String error) {getView().OnError(error);}});}@Overridepublic void putMap(String url, Map<String, String> map, Class aClass) {getiModel().putMap(url, map, aClass, new Contract.ModelCallBack() {@Overridepublic void OnSuccess(Object o) {getView().OnSuccess(o);}@Overridepublic void OnError(String error) {getView().OnError(error);}});}
}

6.view层基类及实类调用

实类继承基类重写抽象方法即可(fragment等基类方式相同)
实类中通过基类暴露出来的p对象调用网络方法即可实现网络请求
调用逻辑:
p调用到p层中的对应方法——p层中方法通过契约的桥梁调用到model中的对应方法,进行网络请求。
返回的数据按照与之相反的逻辑传递到实类view中的OnSuccess方法中
eg:p.getMap(Constant.InformationShowList_URL,map, Bean_Recommend.class);

public abstract class BaseActivity<P extends PresenterImpl> extends AppCompatActivity implements Contract.IView {//泛型对象public P p;@Overridepublic void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);init();}void init(){if(getLayout() != 0){setContentView(getLayout());if(p == null){p = initPresenter();p.attachView(this);}initView();}else {//参数不合法异常throw new IllegalArgumentException();}}//初始化protected abstract P initPresenter();protected abstract int getLayout();protected abstract void initView();
//    protected abstract void initData();@Overrideprotected void onDestroy() {super.onDestroy();if(p != null){p.detachView();p = null;}}}

总结

到这里就ok了,接下来就可以调用方法进行网络请求了

MVP框架——Android相关推荐

  1. android 最新框架组合,android 官方mvp框架优化:lifecycle-mvp,像前端那样组合式写页面...

    目录 1 前言 虽然在标题上,自己很随意的起了这么一个名字.其实并不是说它起个英文名就牛逼了.说白了,它其实就是mvp的思想加了lifecycle-component,然后加入了分层的思想,最后用Ty ...

  2. 框架模式MVC与MVP在Android中的应用

    很多人在开发Android项目时没有考虑过架构模式的问题,以至于随着项目的增大,Activty或者Fragment中代码也会越来越多,导致项目的维护变的越来越复杂.然而在Android中使用比较多的两 ...

  3. Android MVP框架学习

    什么是MVP框架 做Android开发也有好几年时间了,最近接触了Android开发的MVP模式,MVP即Model.View.Presenter的缩写.如果有过一些项目开发经验的人,在项目功能越来越 ...

  4. Android 天气APP(四)搭建MVP框架与使用

    上一篇:Android 天气APP(三)访问天气API与数据请求 MVP/MVVM框架搭建与使用 新版------------------- 一.创建依赖模块 二.模块初始化 三.搭建网络框架 四.基 ...

  5. Android MVP框架MVPro的使用和源码分析

    最近看了两篇关于Android实现MVP的文章一种在android中实现MVP模式的新思路和用MVP架构开发Android应用. 两篇文章的思路都是一样的,即把Activity.Fragment作为P ...

  6. android课程表控件、悬浮窗、Todo应用、MVP框架、Kotlin完整项目源码

    Android精选源码 Android游戏2048 MVP Kotlin项目(RxJava+Rerotfit+OkHttp+Glide) Android基于自定义Span的富文本编辑器 android ...

  7. Android电商MVP框架

    为什么使用MVP, MVP框架相对于MVC框架来说相对复杂一些,代码量相对也要更大一些.但是MVP框架使得model层和view层之间分割开来,使用presenter作为两者之间交互的桥梁.耦合度更低 ...

  8. 如何一步一步实现Android的MVP框架

    内容大纲: Android 开发框架的选择 如何一步步搭建分层框架 使用 RxJava 来解决主线程发出网络请求的问题 结语 一.Android开发框架的选择 由于原生 Android 开发应该已经是 ...

  9. android搭建网络框架,Android 搭建MVP+Retrofit+RxJava网络请求框架(三)

    上一篇中主要是将mvp+rxjava+retrofit进行了结合,本篇主要是对mvp框架的优化:建议先去看上一篇:Android 搭建MVP+Retrofit+RxJava网络请求框架(二) 针对vi ...

最新文章

  1. R语言cox回归模型案例(绘制列线图、校正曲线):放疗是否会延长胰脏癌手术患者的生存时间
  2. CentOS5.8下varnish-2.1.5的安装配置
  3. The DVMM Lab at Columbia University
  4. java构造函数经典详解
  5. object references an unsaved transient instance - save the transient instance before flushing .
  6. PerfDog-移动端性能测试-基本使用
  7. tree(nyoj)
  8. oracle 12c transaction guard,oracle 12c的Data guard中废弃
  9. js 中exec、test、match、search、replace、split用法
  10. 【渝粤教育】国家开放大学2018年春季 0161-21T教师职业道德 参考试题
  11. AUTOCAD——图块批量改名
  12. idea报错500——问题分析解决1
  13. 实验报告三 密码破解技术
  14. 2020第十一届蓝桥杯-决赛-Java大学-C组
  15. 基础编程题目集-7-32 说反话-加强版 (20分)
  16. python命令行窗口最大化_基于python的豆瓣FM(终端命令行界面)
  17. 试用期、加班时间、加班补偿——职场常见知识《劳动法》
  18. 面试题之空瓶子换水问题及其扩展规律(python实现)
  19. 什么是缓存预热和热备?
  20. QS2023亚洲大学排行榜,来了!

热门文章

  1. 全球与中国便携式彩色超声设备市场投资前景及发展趋势预测分析报告2022-2028年
  2. 月半弯,亦真亦幻亦婉约
  3. flex布局---flex-wrap属性,决定排列是否换行
  4. python大数据工程师 培训_大数据工程师需要学习哪些?
  5. Java中级——private、default和protect详解
  6. Linux杂谈之python命令
  7. Dracula PRO 零售版
  8. 【转】不花钱,自己查论文抄袭程度
  9. mooc幕课零基础学Java语言(翁恺)if-else语句比较三个数, 输出最大值
  10. 如何成为一名合格的数据科学家(IT专家网)