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


相关文章
|
2月前
|
设计模式 存储 前端开发
MVVM、MVC、MVP三种常见软件架构设计模式的区别
MVC、MVP 和 MVVM 是三种常见的软件架构设计模式,主要通过分离关注点的方式来组织代码结构,优化开发效率。
74 12
|
3月前
|
设计模式 前端开发 Android开发
Android应用开发中的MVP架构模式解析
【5月更文挑战第25天】本文深入探讨了在Android应用开发中广泛采用的一种设计模式——Model-View-Presenter (MVP)。文章首先概述了MVP架构的基本概念和组件,接着分析了它与传统MVC模式的区别,并详细阐述了如何在实际开发中实现MVP架构。最后,通过一个具体案例,展示了MVP架构如何提高代码的可维护性和可测试性,以及它给开发者带来的其他潜在好处。
|
3月前
|
运维 Oracle 容灾
Oracle dataguard 容灾技术实战(笔记),教你一种更清晰的Linux运维架构
Oracle dataguard 容灾技术实战(笔记),教你一种更清晰的Linux运维架构
|
16天前
|
存储 负载均衡 架构师
架构笔记汇总
架构笔记汇总
50 1
|
1月前
|
存储 缓存 运维
Lustre架构介绍的阅读笔记-HSM
HSM(Hierarchical Storage Management)是数据分级存储管理,根据数据生命周期、访问特性和设备成本,自动在CPU寄存器、缓存、主存、SSD、HDD、光盘、磁带库等不同存储层级间迁移数据。数据热度分为热、温、冷、冰,对应不同成本、性能和容量。迁移策略可基于人工判断或系统自动计算,并确保业务I/O不受影响、数据一致性。访问频率增加时,数据可反向迁移至更高层级。
|
1月前
|
存储 消息中间件 缓存
Lustre架构介绍的阅读笔记-NFS兼容性
Lustre是分布式NFS系统,融合了分布式系统和NFS特性。它支持线性扩展容量和性能,提供POSIX语义,隐藏复杂存储细节。关键技术涉及分布式计算、缓存、锁、事务、通信(RPC、消息队列、同步/异步模式)、选举、任务调度、健康检查、负载均衡、集群管理和QoS。数据一致性、复制(副本、EC)、热点管理及多种上层协议(如NFS、S3)也是重点。分布式存储通过扩容提升读写带宽和IOPS。
|
2月前
|
Java API Android开发
技术经验分享:Android源码笔记——Camera系统架构
技术经验分享:Android源码笔记——Camera系统架构
31 0
|
2月前
|
移动开发 小程序 安全
基础入门-APP架构&小程序&H5+Vue语言&Web封装&原生开发&Flutter
基础入门-APP架构&小程序&H5+Vue语言&Web封装&原生开发&Flutter
|
3月前
|
安全 网络协议 网络安全
网络安全笔记整理,你花了多久弄明白架构设计
网络安全笔记整理,你花了多久弄明白架构设计
|
2天前
|
监控 负载均衡 API
从单体到微服务:架构转型之道
【8月更文挑战第17天】从单体架构到微服务架构的转型是一项复杂而系统的工程,需要综合考虑技术、团队、文化等多个方面的因素。通过合理的规划和实施策略,可以克服转型过程中的挑战,实现系统架构的升级和优化。微服务架构以其高度的模块化、可扩展性和灵活性,为业务的持续发展和创新提供了坚实的技术保障。