ZBLibrary:Android MVP 快速开发框架使用指南——从 Application 初始化到列表缓存与自定义 View

发布时间:2026/10/15 2:01:03
ZBLibrary:Android MVP 快速开发框架使用指南——从 Application 初始化到列表缓存与自定义 View 移动开发UI组件【免费下载链接】Android-ZBLibrary Android MVP 快速开发框架做国内 「示例最全面」「注释最详细」「使用最简单」「代码最严谨」的 Android 开源 UI 框架。 An Android MVP Framework with many demos, detailed documents, simple usages and strict codes.项目地址https://gitcode.com/gh_mirrors/an/Android-ZBLibrary点击查看免费下载导读ZBLibraryAndroid-ZBLibrary是一个以 MVP 架构为骨架、以「View、Data、Event」三段式开发标准为规范内置网络请求、图片加载、二维码扫描、状态栏沉浸、自动缓存与大量 Base/Demo/UI/Util 组件的 Android 快速开发框架。本指南以仓库根目录的 README.md 为主线结合 ZBLibrary 与 app 两个模块的源码实现带你从 Application 初始化入手一步步掌握框架的 HTTP 请求封装、列表加载与缓存、自定义 View、手势交互等核心能力学会复制模板、改包名、改代码的 ZBLibrary 式开发流程。一、框架定位MVP 架构与三段式开发标准1.1 框架解决什么问题从 README.md 的定位描述看ZBLibrary 提供一套完整的开发标准View、Data、Event以及模板和工具类目标是规范代码、减少封装层级、保持简单高效与良好兼容性。它把 Android 开发中最常见的诉求直接打包成拿来即用的组件OKHttp 网络请求Glide 图片加载ZXing 二维码沉浸状态栏下载安装自动缓存各类 Base 基类、Demo 示例、UI 控件、Util 工具类1.2 仓库结构与模块划分从仓库顶层结构看项目由三个 Gradle 模块组成模块作用ZBLibrary框架本体位于zuo.biao.library包下包含 base/interfaces/manager/model/ui/util 六大分包QRCodeLibrary基于 ZXingLib 精简改造的二维码库zxing.jar 位于 libs/zxing.jarapp示例工程zblibrary.demo内含 20 个可直接复制的 Demo框架本体的分包结构体现了清晰的职责划分baseBaseActivity、BaseFragment、BaseAdapter、BaseHttpListActivity、BaseHttpRecyclerActivity等基类interfacesActivityPresenter、FragmentPresenter、OnHttpResponseListener、CacheCallBack等回调接口managerHttpManager、CacheManager、ThreadManager、SystemBarTintManager等管理器modelEntry、Parameter、Menu、City等数据模型uiAlertDialog、BottomMenuWindow、PlacePickerWindow、WebViewActivity等现成 UIutilStringUtil、JSON、MD5Util、TimeUtil、DownloadUtil等工具。1.3 编程思想12 条开发规范README 中明确列出框架作者倡导的编程思想这既是写代码的方法论也是阅读本框架源码时的说明书完整继承如下能复制就复制节约时间避免出错保留原本结构简单上手容易调试增加必要注释说明功能和使用方法说明随手可得不用上网或打开文档命名必须规范容易查找一看就懂重载尽量转发减少代码容易修改最先校验参数任意调用不会崩溃代码模块分区方便浏览容易查找封装常用代码方便使用降低耦合回收多余占用优化内存提高性能分包结构合理模块清晰浏览方便多用工具和快捷键增删改查快捷高效。这套思想在源码中处处可见每个类都有use、must、warn注释每个方法开头都先做null判空并Log.e后return代码严格按UI显示区 / Data数据区 / Event事件区分区注释。二、快速上手Application 初始化2.1 两种初始化方式README 提供了两种让框架启动的写法前提是你的 Application 已在 AndroidManifest.xml 中注册application android:namezblibrary.demo.application.DemoApplication ... /application方式一继承 BaseApplication推荐public class DemoApplication extends BaseApplication { ... }继承后BaseApplication.onCreate()会自动调用init(this)无需手动初始化。示例工程中的 DemoApplication.java 正是这种方式public class DemoApplication extends BaseApplication { private static DemoApplication context; public static DemoApplication getInstance() { return context; } Override public void onCreate() { super.onCreate(); context this; } // 基于 DataManager 实现当前用户缓存getCurrentUser/saveCurrentUser/logout... }方式二在自己的 Application 的 onCreate 中手动调用public class DemoApplication extends Application { Override public void onCreate() { super.onCreate(); BaseApplication.init(this); } ... }2.2 BaseApplication.init 内部做了什么从 BaseApplication.java 源码看init是框架的启动总开关共三步保存全局Application单例instance供HttpManager、CacheManager等单例管理器获取 ContextDataKeeper.init(instance)初始化数据存储工具SettingUtil.init(instance)初始化应用设置缓存开关、预加载、提示音等。其中 DataKeeper.java 有一个必须改的地方——类顶部的TODO注释明确要求把fileRootPath中的包名默认zblibrary.demo改成你自己的应用包名否则文件缓存目录会落在错误的路径下/**TODO 必须将fileRootPath中的包名这里是zblibrary.demo改为你的应用包名*/ public static final String fileRootPath getSDPath() ! null ? (getSDPath() /zblibrary.demo/) : null;2.3 权限与 Activity 注册README 提示权限和 Activity 等代码可直接复制 ZBLibrary/AndroidManifest.xml 中的相应片段。该文件内部同样用复制粘贴到你的工程的AndroidManifest.xml内对应位置注释标注了哪些是框架必需、哪些可按需裁剪基础权限INTERNET、READ_EXTERNAL_STORAGE、WRITE_EXTERNAL_STORAGE按需权限注释标明CommonUtil 等类的部分功能需要不需要的功能对应的权限可不复制粘贴ACCESS_NETWORK_STATE、ACCESS_WIFI_STATE、ACCESS_FINE_LOCATION、CAMERA、CALL_PHONE、SEND_SMS需注册的库内 Activityzuo.biao.library.ui.SelectPictureActivity选图、zuo.biao.library.ui.CutPictureActivity裁剪等全面屏适配android.max_aspect元数据值为2.1。三、底层依赖的开源组件README「感谢开源」一节交代了框架依赖的核心组件及其在库内的落点这是理解框架能力来源的关键组件用途在仓库中的封装/落点GlideOKHttpFastJsonSmartRefreshLayoutSystemBarTintZXingLib二维码作者对官方 ZXing 精简后改造为仓库的 QRCodeLibraryREADME 特别强调一条易踩的坑okio.jar是 OKHttp 的一部分不能删除。删除后代码不会报编译错误但运行时必然出错。使用依赖时请务必保留 okio。四、HTTP 请求封装HttpManager 与自签名 HTTPS4.1 单例与基础 APIHttpManager.java 是框架的网络层核心采用双重检查锁的单例模式见 L72-L82并通过BaseApplication.getInstance()获取全局 Context。核心 API 如下// GET 请求参数以 Map 拼接到 URL 尾部 HttpManager.getInstance().get(requestMap, url, requestCode, listener); // POST 表单请求application/x-www-form-urlencoded HttpManager.getInstance().post(requestMap, url, requestCode, listener); // POST JSON 请求application/json; charsetutf-8isJsontrue 时走 JSON 体 HttpManager.getInstance().post(requestMap, url, true, requestCode, listener);各参数含义requestMapString, Object形式的请求参数url接口地址requestCode请求码类似onActivityResult的 requestCode。同一页面发起多个请求时回调方法 onHttpResponse(int requestCode, String resultJson, Exception e) 用 requestCode 区分各请求listenerOnHttpResponseListener回调在 UI 线程的onPostExecute中触发。仓库中还保留了以ListParameter传参的旧版重载get(ListParameter...)/post(ListParameter...)但均已标注Deprecated注释提示最快在 19.0 删除请尽快迁移到 Map 版本新代码应直接使用Map参数。4.2 底层实现细节从源码可确认的底层行为超时配置getHttpClient统一设置connectTimeout(15s)、writeTimeout(10s)、readTimeout(10s)见 L298-L301Cookie 持久化自定义CookieJar用SharedPreferenceskey 为cookie按 host 维度保存/恢复 Cookie见 L302-L335响应解析getResponseJson仅在response.isSuccessful()时返回 body 字符串HTTPS 自签名支持构造时从assets/demo.cer读取证书demo.cer为演示用的自签名证书文件见 app/src/main/assets/demo.cer当 URL 以https://开头且证书加载成功时通过SSLUtil.getSSLSocketFactory(...)注入sslSocketFactory见 L337-L340。4.3 SSLUtil 自签名证书工具SSLUtil.java 提供了两条核心能力getSSLSocketFactory(InputStream... certificates)读取 X.509 格式证书构建TrustManagerFactory生成信任该证书的SSLSocketFactorygetKeyManagers(InputStream bks, String keystorePass)加载 BKS 格式客户端证书用于双向认证场景。同时它注释了证书导出技巧使用命令keytool -printcert -rfc -file srca.cer可将证书导出为字符串再转成输入流供 OKHttp 使用。4.4 Demo 中的请求封装范式HttpRequest.java 展示了一个方法对应一个接口的推荐封装方式。它把 URL 基址与参数、请求类型全部集中管理public static void getUser(long userId, final int requestCode, final OnHttpResponseListener listener) { MapString, Object request new HashMap(); request.put(CURRENT_USER_ID, DemoApplication.getInstance().getCurrentUserId()); request.put(USER_ID, userId); HttpManager.getInstance().get(request, URL_BASE /user, requestCode, listener); }其中URL_BASE SettingUtil.getCurrentServerAddress()支持在 ServerSettingActivity.java 中切换服务器地址。密码等敏感字段先经 MD5Util.java 的MD5加密再提交。README 与源码都强调所有请求的 URL、方法GET/POST、参数 key-value 必须严格符合后端接口文档必要 key 一定要加、没提供的 key 不要加。五、列表加载与自动缓存几行代码搞定 HTTP 列表5.1 BaseHttpListActivity 的完整加载链路README 用一句话概括了它的价值用 BaseHttpListActivity几行代码搞定 HTTP 请求列表加载和缓存。从 BaseHttpListActivity.java 的类注释可确认完整数据流srlBaseHttpList.autoRefresh()触发下拉刷新内部借助 SmartRefreshLayoutgetListAsync(page)异步发起网络请求回调onHttpResponse(requestCode, resultJson, e)其中requestCode 约定传-page的负数在回调内通过page -requestCode还原页码见 L202-L218parseArray(json)把 JSON 字符串解析为ListTonResponse(page, list, e)依据列表为空且异常非空判定失败走onLoadFailed否则走onLoadSucceedsetList(list)把数据绑定到 adapter 并刷新 UI。子类最少需要实现两个抽象方法// 发起第 page 页的请求page 从 0 开始对应 PAGE_NUM_0 public abstract void getListAsync(int page); // 把服务端返回的 JSON 解析为列表在非 UI 线程执行 public abstract ListT parseArray(String json);5.2 下拉刷新与上拉加载的骨架BaseListActivityBaseListActivity.java 承担了列表的通用加载、缓存、分页骨架几个关键机制首页页码约定public static final int PAGE_NUM_0 0有些服务器页码从 1 开始可自行调整防重复加载isLoading标记保证同一时刻只有一个请求在飞见 L181-L186加载更多onLoadMore()只有在首页加载成功isSucceed true后才允许翻页isHaveMore控制是否还有下一页缓存双通道loadData(page, isCache)中若开启缓存则先从磁盘缓存CacheManager.getList(...)取数据展示紧接着再走网络刷新见 L204-L220——这正是自动缓存的实现位置缓存写入网络数据成功后会saveCache(newList)把每条数据按cacheCallBack.getCacheId(data)作为 key 写入缓存见 L362-L377。5.3 缓存分层CacheManager 与 Cache缓存由两层构成CacheManager.java单例管理类负责按数据类clazz划分SharedPreferences存储空间支持分组GROUP与分页pageSizeMAX_PAGE_SIZE 10是单页缓存上限。路径规则为DataKeeper.ROOT_SHARE_PREFS_ 类名 LIST/GROUPCache.java通用泛型缓存把对象经 JSON.toJSONString 序列化为字符串存入SharedPreferences读取时JSON.parseObject(json, clazz)反序列化还原。5.4 RecyclerView 版本与 Demo 参考ListView/GridView 版本BaseHttpListActivityAbsListView 系与BaseHttpListFragment参考 DemoHttpListActivity.javaRecyclerView 版本BaseHttpRecyclerActivity/BaseHttpRecyclerFragment同样内置 SmartRefreshLayout 的刷新加载见 BaseHttpRecyclerActivity.java参考 DemoHttpRecyclerActivity.javaFragment 版本BaseHttpListFragment/BaseHttpRecyclerFragment参考 DemoListFragment.java。六、自定义 ViewBaseView 与万能的 Entry6.1 用 BaseView 让自定义 View 变得简单README 宣称用 BaseView自定义 View 竟然如此简单。BaseView.java 继承自RecyclerView.ViewHolder既可以作为 Adapter 的 ItemView也可以单独作为一个组件使用。它提供的基础能力免强转查找findView(id)/findView(id, listener)泛型方法一行代码完成查找并注册点击事件数据与状态data、position、viewType、selected四个字段配合bindView(T data, int position, int viewType)规范绑定回调机制OnViewClickListener点击事件回调与OnDataChangedListener数据变更回调两个内部接口常用方法内置showShortToast、toActivity转发给CommonUtil、getResources系列取值方法、onDestroy回收。以 Demo 中的 DemoComplexView.java 为模板自定义一个 View 只需复制 粘贴 改名 改代码四步public class DemoComplexView extends BaseViewEntryString, String implements OnClickListener { public DemoComplexView(Activity context) { super(context, R.layout.demo_complex_view); // 换成你的 layout } Override public View createView() { ivDemoComplexViewHead findView(R.id.ivDemoComplexViewHead); tvDemoComplexViewName findView(R.id.tvDemoComplexViewName, this); return super.createView(); } Override public void bindView(EntryString, String data_) { super.bindView(data_ ! null ? data_ : new EntryString, String()); Glide.with(context).load(data.getKey()).into(ivDemoComplexViewHead); // 图片加载 tvDemoComplexViewName.setText(Name position); } }6.2 万能的 Entry两个变量的 Model 不用再写README 说用 EntryK, V两个变量的 Model/JavaBean 再也不用写了。Entry.java 是一个继承自BaseModel的泛型键值对提供new Entry(key)、new Entry(key, value)两个构造器与getKey/getValue/setKey/setValue方法isCorrect()判定key ! null。注意它的使用边界源码warn注释K、V 都是基本类型时不建议使用判空麻烦不如新建一个专门的 Model。上面DemoComplexView用EntryString, String承载头像 URL 展示文案正是典型用法。七、沉浸状态栏与全新的手势操作7.1 状态栏沉浸4.4 自动生效BaseActivity.java 重写了setContentView(int layoutResID)当Build.VERSION.SDK_INT KITKAT时自动给 Window 设置FLAG_TRANSLUCENT_STATUS并通过SystemBarTintManager设置状态栏着色资源R.color.topbar_bg可换为 drawable 资源。也就是说所有继承 BaseActivity 的页面在 Android 4.4 上无需任何额外代码即可获得沉浸式状态栏。7.2 手势底部滑动 点标题栏左右按钮README 的表述很有冲击力全新的手势侧滑返回、全局右滑返回都 OUT 啦这里的新手势是指 BaseActivity 内置的底部左右滑动在页面底部区域水平滑动等价于点击标题栏的返回/前进按钮。实现要点见 BaseActivity.java使用GestureDetectordispatchTouchEvent分发触摸事件onFling中先判断手指起点是否位于屏幕底部bottom_drag_height高度区域内横向滑动距离超过bottom_drag_min_width且纵向位移小于bottom_drag_max_height时触发onBottomDragListener.onDragBottom(false/true)。接入方式子类实现OnBottomDragListener接口并在onCreate中调用setContentView(layoutResID, this)见 DemoActivity.java。同时手机返回键onKeyUp的KEYCODE_BACK与菜单键KEYCODE_MENU也被映射到同一套onDragBottom(false/true)逻辑保证物理按键与手势行为一致。7.3 其它内置的 Activity 能力从 BaseActivity.java 还能看到大量免写代码页面跳转toActivity(intent)系列重载自动附带转场动画right_push_in/hold可传showAnimationfalse关闭标题栏autoSetTitle()自动读取上个页面通过INTENT_TITLE传入的标题进度弹窗showProgressDialog(...)/dismissProgressDialog()ToastshowShortToast(...)支持顺带强制关闭进度弹窗线程runUiThread(Runnable)安全包装runOnUiThread、runThread(name, runnable)经由 ThreadManager.java 的HandlerThread池执行退出 App注册ACTION_EXIT_APP广播收到即finish()内存回收onDestroy中统一销毁进度弹窗、注销广播、销毁线程、清空 DrawingCache 与成员引用。八、100 Styles一行搞定 View 属性README 提到库内提供了100 多个常用 Style目标是一行搞定 View 属性一键统一配置 UI。实际 styles.xml 共 1131 行按功能分区组织例如style namewrap_wrap item nameandroid:layout_widthwrap_content/item item nameandroid:layout_heightwrap_content/item /style style namematch_match item nameandroid:layout_widthmatch_parent/item item nameandroid:layout_heightmatch_parent/item /style style nameactivity_page item nameandroid:splitMotionEventsfalse/item item nameandroid:layout_widthfill_parent/item item nameandroid:layout_heightfill_parent/item item nameandroid:backgroundcolor/activity_bg/item item nameandroid:orientationvertical/item !-- 状态栏沉浸 -- item nameandroid:clipToPaddingtrue/item item nameandroid:fitsSystemWindowstrue/item /style style nameblank parentblank item nameandroid:layout_height10dp/item /style style nameblank_small parentblank item nameandroid:layout_height5dp/item /style命名上遵循取单词首字母的简写约定如wrap_wrap、match_match并大量使用parent继承形成尺寸系列blank_small/middle/big/huge/large。配合 colors.xml、dimens.xml 与 drawable 下的上百个 selector/shape 资源可以在不写重复属性的前提下统一全 App 的观感。九、二维码模块QRCodeLibraryREADME 说明 QRCodeLibrary 是对 ZXingLib官方 ZXing 的精简版改造而来。它提供了开箱即用的扫码 Activity——CaptureActivity.java以及配套的相机管理CameraManager.java、自动对焦AutoFocusCallback.java、解码DecodeHandler.java、取景框绘制ViewfinderView.java等完整组件。接入时复制 QRCodeLibrary/AndroidManifest.xml 中的权限声明即可uses-permission android:nameandroid.permission.VIBRATE / uses-permission android:nameandroid.permission.CAMERA / uses-permission android:nameandroid.permission.FLASHLIGHT / uses-feature android:nameandroid.hardware.camera / uses-feature android:nameandroid.hardware.camera.autofocus /App 侧的 ScanActivity.java 与 QRCodeActivity.java 演示了扫描与生成EncodingHandler.java的完整用法。十、自动化生成代码APIAutoREADME 推荐配合 APIAuto 自动化接口管理工具生成接口相关代码可自动完成自动生成封装请求 JSON 的代码自动生成解析结果 JSON 的代码自动生成 Model/JavaBean。这与框架的JSON.parseObject/parseArray约定天然衔接生成的 Bean 直接作为BaseHttpListActivityT的泛型 T 使用请求参数直接放入HttpManager的Map即可。十一、Demo 与生态边看边抄的示例工程示例工程app 模块的zblibrary.demo提供了 20 个覆盖框架各能力的 Demo包括DemoActivityBaseActivity 用法、DemoComplexView自定义 View、DemoHttpListActivityHTTP 列表、DemoHttpRecyclerActivityRecyclerView 列表、DemoSQLActivitySQLite、DemoThreadPoolActivity线程池、DemoTimeRefresherActivity定时刷新、DemoBottomWindow底部弹窗等README 说明提供了可下载试用的 ZBLibraryDemoApp.apk 与 APIJSONApp.apk后者的目标是展示 APIJSON ZBLibrary 组合方案相关主题文章README 整理了多篇实战博文主题包括框架介绍、如何使用、仿朋友圈自定义 View、BaseHttpListActivity、分页列表、Adapter 快速开发、Entry 妙用、自签名 SSL 证书、100 Styles、ZXing 扫描界面定制等——这些主题在本文对应章节均有源码级落点开发规范 / 架构模式 / FAQREADME 以 Wiki 形式提供了《开发规范》《架构、模式、技术》《问题及解决方法》三份文档建议按需查阅生态联动README 列出的生态项目包括零代码 ORM 库 APIJSON、接口工具 APIAuto、单元测试工具 UnitAuto、UI 录制回放平台 UIGO 及其 AndroidX 版 UIGOX、列表级联算法 AbsGrade、分页滑动列表 PagedListView、鸿蒙版 ohos-ZBLibrary 等并提到 APIJSON-Android-RxJava 是 ZBLibrary(UI) APIJSON(HTTP) RxJava(Data) 的实战示例。十二、小结ZBLibrary 的使用路线图综合 README 与源码接入 ZBLibrary 的推荐路线可以归纳为四步初始化Application 继承BaseApplication或手动调用BaseApplication.init(this)按 DataKeeper.java 的 TODO 改掉包名从 ZBLibrary/AndroidManifest.xml 复制权限与 Activity写页面Activity/Fragment 继承BaseActivity/BaseFragment按initView / initData / initEvent三段式组织代码用findView、toActivity、showShortToast、runUiThread等内置方法接数据列表页继承BaseHttpListActivity/BaseHttpRecyclerActivity实现getListAsync与parseArray配合HttpManager发起请求、CacheManager自动缓存抠细节用BaseViewEntry自定义 Item用 100 Styles 统一 UI用BaseActivity内置的沉浸状态栏与底部滑动手势提升体验需要扫码时引入QRCodeLibrary。整套框架以复制 粘贴 改名 改代码为方法论让新项目在几小时内就拥有网络、缓存、列表、UI、工具类等完整基础设施同时在注释与分区上保留了极强的可读性和可维护性非常适合作为 Android 项目的开发底座来学习与使用。赞分享移动开发UI组件【免费下载链接】Android-ZBLibrary Android MVP 快速开发框架做国内 「示例最全面」「注释最详细」「使用最简单」「代码最严谨」的 Android 开源 UI 框架。 An Android MVP Framework with many demos, detailed documents, simple usages and strict codes.项目地址https://gitcode.com/gh_mirrors/an/Android-ZBLibrary点击查看免费下载相关推荐Python 列表初始化实战用 initialize_list_with_values 快速填充指定值列表Python 列表初始化实战用 initialize_list_with_values 快速填充指定值列表 在 Python 日常开发中“初始化一个长度为教程文档ZXing自定义Application全局配置与初始化ZXing自定义Application全局配置与初始化 为什么需要自定义Application 在Android开发中 Application 类是整个应用图像处理计算机视觉SmoothScroll Polyfill 终极指南为你的网站注入丝滑滚动体验SmoothScroll Polyfill 终极指南为你的网站注入丝滑滚动体验 你是否曾经在浏览网页时被那种生硬、跳跃式的页面滚动体验所困扰当用户点击一个前端上一篇深入理解GifuiOS高性能GIF动画框架下一篇Tabby现代化终端模拟器的终极解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询