news 2026/10/21 22:56:37

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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
点击查看免费下载

导读

ZBLibrary(Android-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.jar)
app示例工程zblibrary.demo,内含 20+ 个可直接复制的 Demo

框架本体的分包结构体现了清晰的职责划分:

  • base:BaseActivity、BaseFragment、BaseAdapter、BaseHttpListActivity、BaseHttpRecyclerActivity等基类;
  • interfaces:ActivityPresenter、FragmentPresenter、OnHttpResponseListener、CacheCallBack等回调接口;
  • manager:HttpManager、CacheManager、ThreadManager、SystemBarTintManager等管理器;
  • model:Entry、Parameter、Menu、City等数据模型;
  • ui:AlertDialog、BottomMenuWindow、PlacePickerWindow、WebViewActivity等现成 UI;
  • util:StringUtil、JSON、MD5Util、TimeUtil、DownloadUtil等工具。

1.3 编程思想(12 条开发规范)

README 中明确列出框架作者倡导的编程思想,这既是写代码的方法论,也是阅读本框架源码时的"说明书",完整继承如下:

  1. 能复制就复制,节约时间避免出错;
  2. 保留原本结构,简单上手容易调试;
  3. 增加必要注释,说明功能和使用方法;
  4. 说明随手可得,不用上网或打开文档;
  5. 命名必须规范,容易查找一看就懂;
  6. 重载尽量转发,减少代码容易修改;
  7. 最先校验参数,任意调用不会崩溃;
  8. 代码模块分区,方便浏览容易查找;
  9. 封装常用代码,方便使用降低耦合;
  10. 回收多余占用,优化内存提高性能;
  11. 分包结构合理,模块清晰浏览方便;
  12. 多用工具和快捷键,增删改查快捷高效。

这套思想在源码中处处可见:每个类都有@use、@must、@warn注释;每个方法开头都先做null判空并Log.e后return;代码严格按UI显示区 / Data数据区 / Event事件区分区注释。

二、快速上手:Application 初始化

2.1 两种初始化方式

README 提供了两种让框架启动的写法,前提是你的 Application 已在 AndroidManifest.xml 中注册:

<application android:name="zblibrary.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是框架的启动总开关,共三步:

  1. 保存全局Application单例instance(供HttpManager、CacheManager等单例管理器获取 Context);
  2. DataKeeper.init(instance):初始化数据存储工具;
  3. 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;
  • 需注册的库内 Activity:zuo.biao.library.ui.SelectPictureActivity(选图)、zuo.biao.library.ui.CutPictureActivity(裁剪)等;
  • 全面屏适配:android.max_aspect元数据,值为2.1。

三、底层依赖的开源组件

README「感谢开源」一节交代了框架依赖的核心组件及其在库内的落点,这是理解框架能力来源的关键:

组件用途在仓库中的封装/落点
Glide
OKHttp
FastJson
SmartRefreshLayout
SystemBarTint
ZXingLib二维码作者对官方 ZXing 精简后改造为仓库的 QRCodeLibrary

README 特别强调一条易踩的坑:okio.jar是 OKHttp 的一部分,不能删除。删除后代码不会报编译错误,但运行时必然出错。使用依赖时请务必保留 okio。

四、HTTP 请求封装:HttpManager 与自签名 HTTPS

4.1 单例与基础 API

HttpManager.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; charset=utf-8,isJson=true 时走 JSON 体) HttpManager.getInstance().post(requestMap, url, true, requestCode, listener);

各参数含义:

  • request:Map<String, Object>形式的请求参数;
  • url:接口地址;
  • requestCode:请求码,类似onActivityResult的 requestCode。同一页面发起多个请求时,回调方法 onHttpResponse(int requestCode, String resultJson, Exception e) 用 requestCode 区分各请求;
  • listener:OnHttpResponseListener回调,在 UI 线程的onPostExecute中触发。

仓库中还保留了以List<Parameter>传参的旧版重载(get(List<Parameter>...)/post(List<Parameter>...)),但均已标注@Deprecated,注释提示"最快在 19.0 删除,请尽快迁移到 Map 版本",新代码应直接使用Map参数。

4.2 底层实现细节

从源码可确认的底层行为:

  • 超时配置:getHttpClient统一设置connectTimeout(15s)、writeTimeout(10s)、readTimeout(10s)(见 L298-L301);
  • Cookie 持久化:自定义CookieJar,用SharedPreferences(key 为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,生成信任该证书的SSLSocketFactory;
  • getKeyManagers(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) { Map<String, 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 的类注释可确认完整数据流:

  1. srlBaseHttpList.autoRefresh()触发下拉刷新(内部借助 SmartRefreshLayout);
  2. getListAsync(page)异步发起网络请求;
  3. 回调onHttpResponse(requestCode, resultJson, e),其中requestCode 约定传-page的负数,在回调内通过page = -requestCode还原页码(见 L202-L218);
  4. parseArray(json)把 JSON 字符串解析为List<T>;
  5. onResponse(page, list, e)依据"列表为空且异常非空"判定失败走onLoadFailed,否则走onLoadSucceed;
  6. setList(list)把数据绑定到 adapter 并刷新 UI。

子类最少需要实现两个抽象方法:

// 发起第 page 页的请求(page 从 0 开始,对应 PAGE_NUM_0) public abstract void getListAsync(int page); // 把服务端返回的 JSON 解析为列表(在非 UI 线程执行) public abstract List<T> parseArray(String json);

5.2 下拉刷新与上拉加载的骨架:BaseListActivity

BaseListActivity.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)与分页(pageSize);MAX_PAGE_SIZE = 10是单页缓存上限。路径规则为DataKeeper.ROOT_SHARE_PREFS_ + 类名 + "LIST"/"GROUP";
  • Cache.java:通用泛型缓存,把对象经 JSON.toJSONString 序列化为字符串存入SharedPreferences,读取时JSON.parseObject(json, clazz)反序列化还原。

5.4 RecyclerView 版本与 Demo 参考

  • ListView/GridView 版本:BaseHttpListActivity(AbsListView 系)与BaseHttpListFragment,参考 DemoHttpListActivity.java;
  • RecyclerView 版本:BaseHttpRecyclerActivity/BaseHttpRecyclerFragment,同样内置 SmartRefreshLayout 的刷新加载(见 BaseHttpRecyclerActivity.java),参考 DemoHttpRecyclerActivity.java;
  • Fragment 版本:BaseHttpListFragment/BaseHttpRecyclerFragment,参考 DemoListFragment.java。

六、自定义 View:BaseView 与万能的 Entry

6.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 BaseView<Entry<String, 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(Entry<String, String> data_) { super.bindView(data_ != null ? data_ : new Entry<String, String>()); Glide.with(context).load(data.getKey()).into(ivDemoComplexViewHead); // 图片加载 tvDemoComplexViewName.setText("Name " + position); } }

6.2 万能的 Entry:两个变量的 Model 不用再写

README 说:"用 Entry<K, 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用Entry<String, 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):

  • 使用GestureDetector+dispatchTouchEvent分发触摸事件;
  • 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,可传showAnimation=false关闭);
  • 标题栏:autoSetTitle()自动读取上个页面通过INTENT_TITLE传入的标题;
  • 进度弹窗:showProgressDialog(...)/dismissProgressDialog();
  • Toast:showShortToast(...),支持顺带强制关闭进度弹窗;
  • 线程: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 name="wrap_wrap"> <item name="android:layout_width">wrap_content</item> <item name="android:layout_height">wrap_content</item> </style> <style name="match_match"> <item name="android:layout_width">match_parent</item> <item name="android:layout_height">match_parent</item> </style> <style name="activity_page"> <item name="android:splitMotionEvents">false</item> <item name="android:layout_width">fill_parent</item> <item name="android:layout_height">fill_parent</item> <item name="android:background">@color/activity_bg</item> <item name="android:orientation">vertical</item> <!-- 状态栏沉浸 --> <item name="android:clipToPadding">true</item> <item name="android:fitsSystemWindows">true</item> </style> <style name="blank" parent="blank"> <item name="android:layout_height">10dp</item> </style> <style name="blank_small" parent="blank"> <item name="android:layout_height">5dp</item> </style>

命名上遵循"取单词首字母"的简写约定(如wrap_wrap、match_match),并大量使用parent继承形成尺寸系列(blank_small/middle/big/huge/large)。配合 colors.xml、dimens.xml 与 drawable 下的上百个 selector/shape 资源,可以在不写重复属性的前提下统一全 App 的观感。

九、二维码模块:QRCodeLibrary

README 说明 QRCodeLibrary 是对 ZXingLib(官方 ZXing 的精简版)改造而来。它提供了开箱即用的扫码 Activity——CaptureActivity.java,以及配套的相机管理(CameraManager.java)、自动对焦(AutoFocusCallback.java)、解码(DecodeHandler.java)、取景框绘制(ViewfinderView.java)等完整组件。

接入时复制 QRCodeLibrary/AndroidManifest.xml 中的权限声明即可:

<uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.FLASHLIGHT" /> <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus" />

App 侧的 ScanActivity.java 与 QRCodeActivity.java 演示了扫描与生成(EncodingHandler.java)的完整用法。

十、自动化生成代码:APIAuto

README 推荐配合 APIAuto 自动化接口管理工具生成接口相关代码,可自动完成:

  • 自动生成封装请求 JSON 的代码;
  • 自动生成解析结果 JSON 的代码;
  • 自动生成 Model/JavaBean。

这与框架的JSON.parseObject/parseArray约定天然衔接:生成的 Bean 直接作为BaseHttpListActivity<T>的泛型 T 使用,请求参数直接放入HttpManager的Map即可。

十一、Demo 与生态:边看边抄的示例工程

  • 示例工程:app 模块的zblibrary.demo提供了 20+ 个覆盖框架各能力的 Demo,包括DemoActivity(BaseActivity 用法)、DemoComplexView(自定义 View)、DemoHttpListActivity(HTTP 列表)、DemoHttpRecyclerActivity(RecyclerView 列表)、DemoSQLActivity(SQLite)、DemoThreadPoolActivity(线程池)、DemoTimeRefresherActivity(定时刷新)、DemoBottomWindow(底部弹窗)等,README 说明提供了可下载试用的 ZBLibraryDemoApp.apk 与 APIJSONApp.apk(后者的目标是展示 APIJSON + ZBLibrary 组合方案);
  • 相关主题文章:README 整理了多篇实战博文,主题包括框架介绍、如何使用、仿朋友圈自定义 View、BaseHttpListActivity、分页列表、Adapter 快速开发、Entry 妙用、自签名 SSL 证书、100+ Styles、ZXing 扫描界面定制等——这些主题在本文对应章节均有源码级落点;
  • 开发规范 / 架构模式 / FAQ:README 以 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 的推荐路线可以归纳为四步:

  1. 初始化:Application 继承BaseApplication(或手动调用BaseApplication.init(this)),按 DataKeeper.java 的 TODO 改掉包名,从 ZBLibrary/AndroidManifest.xml 复制权限与 Activity;
  2. 写页面:Activity/Fragment 继承BaseActivity/BaseFragment,按initView / initData / initEvent三段式组织代码,用findView、toActivity、showShortToast、runUiThread等内置方法;
  3. 接数据:列表页继承BaseHttpListActivity/BaseHttpRecyclerActivity,实现getListAsync与parseArray,配合HttpManager发起请求、CacheManager自动缓存;
  4. 抠细节:用BaseView+Entry自定义 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
点击查看免费下载
上一篇:深入理解Gifu:iOS高性能GIF动画框架
下一篇:Tabby:现代化终端模拟器的终极解决方案

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/20 17:53:22

软考 系统架构设计师历年真题集萃(66)

接前一篇文章:软考 系统架构设计师系列知识点之杂项集萃(65) 第106题 一般说来,SoC称为系统级芯片,也称片上系统,它是一个有专用目标的集成电路产品。以下关于SoC不正确的说法是()。 A. SoC是一种技术,是以实际的、确定的系统功能开始,到软/硬件划分,并完成设计的…

作者头像 李华
网站建设 2026/10/20 10:54:56

PyTorch与CUDA、cuDNN版本匹配全解析:从安装验证到排错

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/21 13:59:50

红外扫码与热敏打印:自助收银小票链路全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/22 1:06:43

以caveman为例:标题拆解法与零依赖极简站点实战

1. 从"caveman"这个标题说起&#xff1a;它到底是什么先交代一句&#xff1a;我拿到这个项目信息时&#xff0c;标题栏里只有孤零零一个单词——"caveman"。没有项目正文&#xff0c;没有背景说明&#xff0c;连一句摘要都没有。这种情况下&#xff0c;我第…

作者头像 李华
网站建设 2026/10/21 19:55:58

从千亿到端侧:1.5B 小模型认知能力迁移的全流程评估基准与质量对账

在当今大语言模型由“单纯拼参数量”转向“端侧轻量化普及”的关键技术周期中&#xff0c;如何将千亿级甚至万亿级 MoE 教师模型的通用认知、复杂因果推理与代码生成能力&#xff0c;高保真地浓缩至 1.5B 至 3B 规模的轻量小模型中&#xff0c;成为了众多端侧 AI 架构团队的兵家…

作者头像 李华