带你封装MVP架构(上)|青训营笔记(一)

简介: 我们做一个 MVP 架构的封装,主要其相对于MVC更加解耦,能让开发人员在编写代码的时候更加高效和舒服。

前置知识

MVPMVP架构模式详解 - 简书 (jianshu.com)

RetrofitRetrofit使用详解-注解介绍

RxJavaCarson带你学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启动方法供外部调用。


相关文章
|
9天前
|
机器学习/深度学习 网络架构 计算机视觉
目标检测笔记(一):不同模型的网络架构介绍和代码
这篇文章介绍了ShuffleNetV2网络架构及其代码实现,包括模型结构、代码细节和不同版本的模型。ShuffleNetV2是一个高效的卷积神经网络,适用于深度学习中的目标检测任务。
37 1
目标检测笔记(一):不同模型的网络架构介绍和代码
|
6天前
|
XML 前端开发 Android开发
Kotlin教程笔记(80) - MVVM架构设计
本系列学习教程笔记详细讲解了Kotlin语法,适合需要深入了解Kotlin的开发者。对于希望快速学习Kotlin语法的读者,建议参考“简洁”系列教程。本文重点介绍了Kotlin实现MVVM架构的设计思路和代码实现,包括Model、ViewModel和View层的具体实现,以及如何通过LiveData和viewModelScope有效管理数据和内存,避免内存泄漏。此外,还讨论了MVVM架构的常见缺点及应对策略,帮助开发者在实际项目中更好地应用这一设计模式。
17 1
|
8天前
|
前端开发 测试技术 数据处理
Kotlin教程笔记 - MVP与MVVM架构设计的对比
Kotlin教程笔记 - MVP与MVVM架构设计的对比
20 2
|
8天前
|
XML 前端开发 Android开发
Kotlin教程笔记(80) - MVVM架构设计
Kotlin教程笔记(80) - MVVM架构设计
20 2
|
15天前
|
前端开发 Java 测试技术
android MVP契约类架构模式与MVVM架构模式,哪种架构模式更好?
android MVP契约类架构模式与MVVM架构模式,哪种架构模式更好?
13 2
|
6天前
|
存储 前端开发 Java
Kotlin教程笔记 - MVVM架构怎样避免内存泄漏
Kotlin教程笔记 - MVVM架构怎样避免内存泄漏
|
8天前
|
前端开发 JavaScript 测试技术
Kotlin教程笔记 - 适合构建中大型项目的架构模式全面对比
Kotlin教程笔记 - 适合构建中大型项目的架构模式全面对比
19 0
|
8天前
|
存储 前端开发 Java
Kotlin教程笔记 - MVVM架构怎样避免内存泄漏
Kotlin教程笔记 - MVVM架构怎样避免内存泄漏
19 0
|
12天前
|
缓存 监控 API
探索微服务架构中的API网关模式
【10月更文挑战第5天】随着微服务架构的兴起,企业纷纷采用这一模式构建复杂应用。在这种架构下,应用被拆分成若干小型、独立的服务,每个服务围绕特定业务功能构建并通过HTTP协议协作。随着服务数量增加,统一管理这些服务间的交互变得至关重要。API网关作为微服务架构的关键组件,承担起路由请求、聚合数据、处理认证与授权等功能。本文通过一个在线零售平台的具体案例,探讨API网关的优势及其实现细节,展示其在简化客户端集成、提升安全性和性能方面的关键作用。
45 2
|
16天前
|
存储 缓存 监控
探索微服务架构中的API网关模式
【10月更文挑战第1天】探索微服务架构中的API网关模式
48 2