前置知识
MVP:MVP架构模式详解 - 简书 (jianshu.com)
Retrofit:Retrofit使用详解-注解介绍
RxJava:Carson带你学Android:这是一篇清晰易懂的Rxjava入门教程 - 简书 (jianshu.com)
ViewBinding:kotlin-android-extensions插件也被废弃了?
浅析封装层级
我们做一个 MVP
架构的封装,主要其相对于MVC更加解耦,能让开发人员在编写代码的时候更加高效和舒服。
那么我们最主要需要做到的就是职责区分以及减少重复,所以必不可少的就是做到可以让 MVP 模式下的数据层、视图层、发布层的更低成本的各司其职,以及在项目中对 Base
基类进行提取关联。此外,我们需要集成常用的工具类以及打造好优雅的网络请求调用方式等等。
那我们可以简单的对项目分包,其至少包括以下几个
-app -base -http -module -util 复制代码
声明:
文章使用到的MVP封装方法是学习于:
yechaoa/wanandroid_java: 🎨 玩安卓客户端 ,MD + Retrofit + RxJava + MVP + AndroidX (github.com)
带你封装自己的MVP+Retrofit+RxJava2框架(二) - 掘金 (juejin.cn)
笔者对该架构进行升级修改,以及在文章中会讲述对网络请求部分的功能添加
工欲善其事,必先利其器
首先,我们载入后续会使用到的开源框架
//app/build.gradle android { ... defaultConfig { ... javaCompileOptions { annotationProcessorOptions { arguments += [ // "room.schemaLocation":"$projectDir/schemas".toString(), eventBusIndex : 'com.qxy.potato.MyEventBusIndex' ] } } ... } ... // 支持使用viewBinding buildFeatures { viewBinding = true } ... } dependencies { //MMKV替代SP https://github.com/Tencent/MMKV/wiki/android_tutorial_cn implementation 'com.tencent:mmkv:1.2.14' /*retrofit raJava*/ implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:adapter-rxjava2:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' implementation 'com.squareup.retrofit2:converter-scalars:2.9.0' implementation 'io.reactivex.rxjava2:rxandroid:2.1.1' implementation 'com.squareup.okhttp3:logging-interceptor:3.12.0' //glide implementation 'com.github.bumptech.glide:glide:4.13.2' annotationProcessor 'com.github.bumptech.glide:compiler:4.13.2' //引入的崩溃管理和跳转UI哭 implementation 'com.github.tamsiree.RxTool:RxKit:2.6.3' implementation 'com.github.tamsiree.RxTool:RxUI:2.6.3' //ViewBinding implementation 'com.github.DylanCaiCoding.ViewBindingKTX:viewbinding-base:2.0.6' implementation 'com.github.DylanCaiCoding.ViewBindingKTX:viewbinding-brvah:2.0.6' //引入Rv管理 implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.7' //沉浸式 implementation 'com.gitee.zackratos:UltimateBarX:0.8.0' //eventBus def eventbus_version = '3.3.1' implementation "org.greenrobot:eventbus:$eventbus_version" annotationProcessor "org.greenrobot:eventbus-annotation-processor:$eventbus_version" } 复制代码
建造一所宏大的房子前,不仅需要图纸,还需要有趁手的工具。
搭建一套好用的框架也是,我们应该构建好几个架构封装过程中必须使用到的工具类
ActivityUtil
该工具类是用于获取当前 Activity ,以及获取封装一些启动 Activity 的操作。
@TargetApi(14) public class ActivityUtil { private static Stack<Activity> activityStack = new Stack<>(); private static final MyActivityLifecycleCallbacks instance = new MyActivityLifecycleCallbacks(); public ActivityUtil() { } /** * @return 返回生命周期回调类 */ public static ActivityLifecycleCallbacks getActivityLifecycleCallbacks() { return instance; } /** * 结束当前Activity * * @param activity 当前Activity */ public static void finishActivity(Activity activity) { if (activity != null) { activityStack.remove(activity); activity.finish(); } } /** * 不用 finish 当前 Activity 时直接调用此方法 * * @param classes */ public static void startActivity(Class classes) { startActivity(classes, false); } /** * 需要 finish 当前 Activity 时调用此方法,布尔值参数传入 true * * @param classes 需要打开的 activity * @param isFinish 是否 finish 当前 activity */ public static void startActivity(Class classes, boolean isFinish) { Activity currentActivity = getCurrentActivity(); Intent intent = new Intent(currentActivity, classes); currentActivity.startActivity(intent); if (isFinish) { finishActivity(currentActivity); } } /** * 关闭所有 Activity */ public static void closeAllActivity() { while (true) { Activity activity = getCurrentActivity(); if (null == activity) { return; } finishActivity(activity); } } /** * 得到当前的 Activity * * @return 当前 Activity */ public static Activity getCurrentActivity() { Activity activity = null; if (!activityStack.isEmpty()) { activity = activityStack.peek(); } return activity; } /** * 启动 activity, 带上参数 * * @param classes 需要打开的 activity * @param hashMap 需要传递的参数 */ public static void startActivity(@SuppressWarnings("rawtypes") Class classes, HashMap<String, String> hashMap) { startActivity(classes, hashMap, false); } /** * 启动 activity, 可以设置是否关闭当前 activity * * @param classes 需要打开的 activity * @param hashMap 需要传递的参数 * @param isFinish 是否关闭当前 activity */ public static void startActivity(@SuppressWarnings("rawtypes") Class classes, HashMap<String, String> hashMap, boolean isFinish) { Activity currentActivity = getCurrentActivity(); Intent intent = new Intent(currentActivity, classes); for (Map.Entry<String, String> entry : hashMap.entrySet()) { intent.putExtra(entry.getKey(), entry.getValue()); } currentActivity.startActivity(intent); if (isFinish) { finishActivity(currentActivity); } } private static class MyActivityLifecycleCallbacks implements ActivityLifecycleCallbacks { private MyActivityLifecycleCallbacks() { } @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { ActivityUtil.activityStack.remove(activity); ActivityUtil.activityStack.push(activity); } @Override public void onActivityStarted(Activity activity) { } @Override public void onActivityResumed(Activity activity) { } @Override public void onActivityPaused(Activity activity) { } @Override public void onActivityStopped(Activity activity) { } @Override public void onActivitySaveInstanceState(Activity activity, Bundle outState) { } @Override public void onActivityDestroyed(Activity activity) { ActivityUtil.activityStack.remove(activity); } } } 复制代码
该类用一个栈来记录启动的Activity,且永远将新创建的Activity放于栈顶,让外部调用者可以立刻调用到当前的Activity事件。
并且封装了各种Activity启动方法供外部调用。