Android MVP架构详解:从分层原理到面试避坑
1. 面试中的MVP为什么几乎每一轮技术面都会问做客户端开发这几年我发现一个很有意思的现象不管你是去面初级、中级还是高级岗位只要聊到架构设计MVP几乎躲不掉。就算职位描述里写的是MVVM、MVI或者Jetpack全家桶面试官也喜欢先从一个最基础的问题切入——你用过MVP吗它和MVC有什么区别然后顺着你的回答一路追问到内存泄漏、接口划分、单元测试这些细节。这个现象背后是有原因的。MVPModel-View-Presenter算得上是Android端架构演进的核心枢纽从原始的Activity里坨代码到后来MVVM、MVI大规模普及中间最关键的一步就是从MVC切到MVP。理解MVP相当于理解界面层和业务层究竟该怎么解耦理解面向接口编程在这种场景下到底落地到什么程度。所以面试官问MVP未必是真想让你在生产环境里手写一套MVP框架而是想通过这个话题快速判断你平时写代码的时候有没有在思考分层、有没有处理过回调嵌套、有没有真正理解生命周期。这篇文章打算把我自己梳理过的MVP相关内容完整整理一遍。从最基础的职责划分到后来面试中反复被追问的几个重难点再到实际上手时容易踩的坑一次性说清楚。无论是准备面试还是刚接触架构想找一个切入点这篇文章应该都能帮上忙。1.1 MVP是什么三层各自干什么MVP全称Model-View-Presenter核心思路就是把用户界面和业务逻辑彻底拆开中间通过Presenter来协调。拆开之后三层各管各的规矩非常清晰。Model层负责数据来源和业务规则。本地数据库、网络请求、文件读写、内存缓存都属于Model的管辖范围。它不关心数据最终怎么展示也不关心用户点了哪个按钮只需要把数据准备好交出去同时把数据变更后的结果回调出去。View层负责所有和界面展示相关的事情。Activity、Fragment、自定义View、Adapter都算View层。它做的事情只有两类把Presenter喂过来的状态渲染到屏幕上把用户的操作转交给Presenter去处理。View层不允许直接访问数据库也不允许自己写网络请求。用我习惯的话说就是View层宁可笨一点也不要越权。Presenter是中间的调度者。用户点了登录按钮View把这件事告诉PresenterPresenter去调Model里对应的接口Model把结果回调给PresenterPresenter再根据结果决定告诉View显示loading还是显示登录成功。整个流程中Presenter不关心控件长什么样它只知道View有一套约定的能力接口比如showLoading()、showLoginSuccess()。这样拆完之后最大的好处是业务逻辑搬到了Presenter里脱离了Android组件的生命周期变得可以单独测试。View层也被简化成一套接口想换实现方式只要满足同样接口就行。1.2 从MVC到MVP它解决了什么痛点很多人最初接触Android开发时习惯把Activity既当View又当Controller。一个页面里的所有逻辑全塞在Activity里网络请求写在onCreate里数据解析写在回调里列表适配写在另一个内部类里弹窗权限逻辑又堆一批。前期功能简单的时候看不出问题等到需求迭代三五轮下来Activity文件上千行任何一次改动都要上下翻半天老代码动不动就崩改也改不动。MVC在Android里的尴尬在于Activity的职责边界太模糊。你说它是Controller界面控制也确实由它承担你说它是ViewsetContentView、UI刷新也确实由它负责。实际开发中Controller和View混在一起所谓分层基本只发生在Model层Activity本身变成了无处安放的上帝类。MVP引入之后最大的变化就是把Activity真正降级成了一个View角色。Activity只负责渲染和事件上报业务决策全部移交给Presenter。Model层从Activity中抽离出来变成一个纯粹的数据提供方。这样就解决了我之前提到的几个问题类因为职责单一而变小了改动的影响范围变清晰了出现Bug第一反应是去查Presenter逻辑而不是在整个Activity里四处翻。1.3 MVP适合谁学、用到什么程度我的建议是MVP适合所有Android开发学习者去认真写一遍。就算你现在的项目已经用上了MVVM甚至直接用Compose配合单向数据流MVP的思维训练依然有价值。原因主要有三个。第一通过手写MVP你能真正体会面向接口编程在设计层面带来的灵活度这种体会在直接使用现成框架时很难获得。第二MVP是理解MVVM、MVI的基础很多面试问题比如ViewModel和Presenter有什么区别都需要你先对MVP有清晰认知才能答明白。第三当前很多存量项目依然在用MVP面试时如果你能熟练说出MVP的适配场景和局限反而会让面试官觉得你对架构模式有完整认知而不是只会套用某一个。用到什么程度的问题我的判断是能独立写出一套干净、可扩展的MVP代码并且能说清楚为什么这样写即可。没有必要去背各种MVP框架的源码也无需纠结于我这个MVP是不是足够标准这种问题——架构模式本身是工具不是教条。2. MVP代码实现接口先行还是实现先行聊完理论直接上手写代码。我见过不少文章把MVP写得很华丽又是泛型抽取又是BasePresenter动辄几百行代码。但面试时我更建议你从最朴素的一套代码讲起然后逐步解释该如何演进。面试官想听的是你的思路不是你背下来的模板代码。2.1 最朴素的一套MVP代码长什么样先从一个最简单的例子说起登录页面。用户输入用户名和密码点击登录按钮等待网络返回展示成功或者失败信息。这个场景足够小但MVP的三层协作能体现得比较完整。先定义View层的接口。View只暴露自己需要的能力不需要的东西一律不要出现。public interface LoginView { void showLoading(); void hideLoading(); void onLoginSuccess(String userInfo); void onLoginFailed(String errorMsg); }再定义Model层。登录动作需要的数据来源以及数据返回后的回调结构都定义在Model里。public interface LoginModel { void login(String username, String password, Callback callback); interface Callback { void onSuccess(String userInfo); void onError(String errorMsg); } }然后是Presenter。public class LoginPresenter { private LoginView view; private LoginModel model; public LoginPresenter(LoginView view, LoginModel model) { this.view view; this.model model; } public void login(String username, String password) { view.showLoading(); model.login(username, password, new LoginModel.Callback() { Override public void onSuccess(String userInfo) { view.hideLoading(); view.onLoginSuccess(userInfo); } Override public void onError(String errorMsg) { view.hideLoading(); view.onLoginFailed(errorMsg); } }); } }最后在Activity里实现LoginView并把Presenter绑定进来。public class LoginActivity extends Activity implements LoginView { private LoginPresenter presenter; Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); presenter new LoginPresenter(this, new LoginModelImpl()); findViewById(R.id.btn_login).setOnClickListener(v - { String username usernameInput.getText().toString(); String password passwordInput.getText().toString(); presenter.login(username, password); }); } Override public void showLoading() { progressBar.setVisibility(View.VISIBLE); } Override public void hideLoading() { progressBar.setVisibility(View.GONE); } Override public void onLoginSuccess(String userInfo) { toast(登录成功); } Override public void onLoginFailed(String errorMsg) { toast(errorMsg); } }这就是MVP最核心的骨架。代码量不大但每一层各司其职Activity只负责界面代码Model只负责异步请求和回调Presenter负责把两者串联起来。2.2 Presenter的核心逻辑和View回调的处理在MVP里Presenter承担了绝大部分决策工作。它接收View的输入调用Model的能力再根据Model的执行结果反向通知View。这里的关键点在于Presenter对View的依赖不是直接依赖Activity而是依赖一个接口。这个设计带来的直接好处我用一个真实场景来说明。登录成功之后需要跳转页面、弹Toast、显示用户信息。如果Presenter直接持有Activity实例那么所有的界面操作都要修改Presenter代码而且Presenter没法在脱离Android环境的情况下单独运行。现在利用LoginView接口Presenter只关心接口方法接口背后是谁实现、怎么实现它全都不知道。测试的时候我可以用一个MockView去替代真实的Activitypublic class MockLoginView implements LoginView { private boolean loadingVisible false; private String loginResult null; Override public void showLoading() { loadingVisible true; } Override public void hideLoading() { loadingVisible false; } Override public void onLoginSuccess(String userInfo) { loginResult userInfo; } Override public void onLoginFailed(String errorMsg) { loginResult errorMsg; } }测试代码里只需要把LoginPresenter和MockLoginView串起来调用login方法跑一遍然后断言MockLoginView的loadingVisible和loginResult是否符合预期。整个过程不需要启动模拟器也不需要等待真实网络请求几秒钟就能完成一轮逻辑验证。这是MVP在可测试性上最直观的优势。同时要注意一个细节Model的登录回调是异步的。当回调触发时Activity可能已经处于销毁状态。上一节写的代码里没有处理这种情况真实开发中这一步处理不当会引发崩溃后面专门说。2.3 一份可运行的Demo需求说明如果自己动手写一个MVP入门Demo我建议不要选登录这种大家都写烂的场景可以做一个效果更直观的小工具比如模仿外卖App的菜品列表加载。需求是这样页面顶部是分类栏左侧是菜品种类右侧是当前分类对应的菜品列表。进入页面时从本地仓库获取数据数据加载过程中展示转圈动画加载成功后把列表渲染出来。点击某个菜品时弹出一个底部半屏对话框展示菜品详情和加购按钮。点击加购后购物车角标数字加一。这个需求涵盖了异步加载、列表渲染、点击事件上报、状态刷新四个基本场景用来验证MVP三层协作非常合适。整个Demo的类结构大致是菜品列表页View实现菜品类目展示、列表刷新、加载动画、点击回调菜品类目Model负责网络或本地数据库获取菜品数据菜品列表Presenter接收页面生命周期事件、处理数据加载流程、组装展示模型通过这个小项目你能把一个MVP从接口定义到实际运行完整走一遍后面再遇到面试题说说你的MVP项目是怎么分层的你就能直接拿这个例子讲比空谈理论有说服力得多。3. 面试官真正想考的是什么把代码跑通只算第一步。面试的时候话题一旦聊到MVP面试官往往会立刻深入。接下来几个问题是我在多次面试中被反复问到的。提前想清楚答案比临时组织语言要稳得多。3.1 高频考点一MVP的内存泄漏与规避MVP一个绕不开的话题就是内存泄漏。Presenter持有View引用View持有Activity引用而异步回调往往比Activity的生命周期更长。等到Activity已经销毁网络请求还没结束回调一旦触发Presenter就会试图调用一个已经不存在界面的方法轻则方法无效重则直接崩溃。常见的规避思路有这几种第一在Activity的onDestroy里主动切断View的引用。Presenter需要提供一个detachView方法把持有的view置空。Activity销毁时调用它这样就不会因为Activity残留导致泄漏。public void detachView() { this.view null; }第二在回调执行前判断View是否为空。这是自己写MVP时最容易忽略的细节。回调里先检查view ! null再做界面操作就能防止Activity已经销毁时触达空引用。model.login(username, password, new LoginModel.Callback() { Override public void onSuccess(String userInfo) { if (view null) { return; } view.hideLoading(); view.onLoginSuccess(userInfo); } Override public void onError(String errorMsg) { if (view null) { return; } view.hideLoading(); view.onLoginFailed(errorMsg); } });第三使用弱引用持有View。弱引用不阻碍垃圾回收器回收Activity在GC发生时Activity能被正常回收。但弱引用会导致代码可读性下降所以我在实际项目中更倾向于前两种方案第三种了解即可。面试中如果被问到这个问题我的标准回答思路是先说明泄漏的根本原因生命周期不同步再列出自己的处理策略detachView 回调判空最后补充一句如果使用的是RxJava还可以通过CompositeDisposable在Activity销毁时统一取消订阅。这样回答逻辑完整也能体现你处理过真实问题。3.2 高频考点二Presenter如何做单元测试这部分面试官问到通常代表他们团队确实在做质量保障或者希望候选人有质量意识。MVP让Presenter脱离了UI层这使得Presenter具备单独测试的可能。具体测试方式分两步。第一步测试登录成功分支。用MockView记录view接收到的回调然后让Model返回成功结果。Test public void login_success_updatesView() { MockLoginView mockView new MockLoginView(); LoginModel model new MockLoginModel(true); // 模拟成功 LoginPresenter presenter new LoginPresenter(mockView, model); presenter.login(admin, 123456); assertEquals(adminInfo, mockView.getLoginResult()); assertFalse(mockView.isLoadingVisible()); }第二步测试登录失败分支。MockModel直接回调错误然后断言View层拿到的是错误信息。Test public void login_failed_updatesView() { MockLoginView mockView new MockLoginView(); LoginModel model new MockLoginModel(false); // 模拟失败 LoginPresenter presenter new LoginPresenter(mockView, model); presenter.login(admin, wrong); assertEquals(用户名或密码错误, mockView.getLoginResult()); }这两段测试代码跑起来并不依赖Android环境所以非常轻量。面试中如果能说出这种测试方式和它的价值基本就能证明你不是只会背架构名字而是真的理解MVP带来的工程化收益。3.3 高频考点三为什么要用接口而不是直接引用这个问题我最早被问到的时候愣了一下。细想之后其实逻辑很清晰MVP整个架构的精髓就在于View层和Presenter层之间的依赖是抽象的而非具体的。如果Presenter直接持有Activity会出现两个问题。第一Presenter失去复用能力换一套UI实现就必须改逻辑代码第二Presenter无法脱离Activity进行单元测试。用接口之后Activity只是LoginView的一个具体实现还有其他具体的实现方式比如测试用的MockLoginView未来可能出现的Jetpack Compose实现。Presenter只依赖LoginView这个抽象约束和具体实现完全解耦。这背后就是设计原则里依赖倒置的体现高层模块Presenter不应该依赖低层模块Activity的具体实现而应该依赖抽象LoginView接口。面试时说出这一层通常会让面试官对你的设计功底有更深印象而不是停留在我背了MVP的定义。4. MVP与MVVM、MVI的横向对比面试进行到这儿范围常常会从MVP本身扩展到整个Android架构演进。常见的问题是你了解MVVM吗如果现在的项目重新推进架构你还会选MVP吗所以这部分我需要把MVP放在更大的图景里对比来看。4.1 面试如果问你为什么不选MVVMMVP和MVVM表面上看起来很相似都解决了MVC的分层混乱问题但核心区别在于View如何响应数据变化。MVP里Presenter把处理好后的数据主动推给View调用view.showXXX()来触发界面更新。View是被动的它等着Presenter来通知。而在MVVM里ViewModel暴露可观察的数据容器界面通过数据绑定或观察者模式自动感知变化并刷新ViewModel不需要持有一个View引用。最简单的理解是MVP是履行约定的调用MVVM是观察并自动响应。所以当被问到为什么不选MVVM时我的思路是这样的MVP直接、容易调试数据流明确适合逻辑不算特别复杂、希望能精确控制每一步界面变化的项目。它的劣势在ViewModel不用背绑定关系后确实存在——哪怕只是变化一个状态字段也可能需要显式调用一个方法这一点会让代码显得啰嗦。但MVVM也不是银弹。数据绑定引入之后排错困难不好说某个界面状态从哪来。尤其项目团队成员水平参差不齐时MVP的显式调用反而更容易阅读。这个回答不偏向某一方而是从团队阶段和项目复杂度出发会让面试官觉得你的选型是经过权衡的。4.2 不同模式之间的取舍逻辑再往后还可能会聊到MVI。MVI强调单向数据流和无状态View所有UI状态都集中在一个不可变的State对象里。它的核心理念是用户操作不会直接修改界面而是产生一个Intent经过业务逻辑处理之后生成新State再交给View渲染。MVP和MVI的关系在某种程度上和MVP与MVVM的关系类似。MVP把状态分散在View各个控件中想改状态就调用View方法MVI则把状态聚合成单一数据流便于状态追踪。一旦应用到复杂页面MVI的一切皆Stream会让代码变得极其可预测但学习成本也更高。这里我的建议是别把架构模式当宗教。选择架构的第一标准是团队熟悉度第二标准是问题复杂度。如果一个页面只有列表展示和少量交互MVP完全够用如果页面状态非常多、交互链路很长MVI或MVVM可能更合适。面试时能给出这样清晰的选型逻辑比单纯背MVVM更好要加分很多。5. 实战复盘与避坑经验这部分我想分享一些在实际项目中摸爬滚打出来的经验。这些经验在我看过的教程和文档里很少被提及但它们对真正落地MVP非常关键。5.1 我在实际项目中踩过的坑第一个坑是过度设计。我刚接触MVP时一上来就想着做一个万能BasePresenter又抽泛型又做生命周期绑定最后代码复杂到连我自己维护起来都很吃力。后来才意识到架构是为业务服务的不是用来炫技的。简单场景直接用简单的MVP结构等需要复用的逻辑出现再逐步抽象。这个教训我到现在写代码都还在受益。第二个坑是生命周期监听不完全。MVP里有个容易被忽略的问题一个页面在后台时Presenter还在接收数据回调。如果此时View已经不可见但你仍然执行了界面刷新操作并不会立即崩溃却会在重新回到前台时闪烁。更严重的场景是Fragment重建Activity还在但Fragment的视图已经销毁此时调用findViewById会直接空指针。处理方案是让Presenter感知View的可见性。常见做法是在基类里维护一个View.isActive()的判断条件或者利用Lifecycle组件地观察Activity状态。我这里用最可控的方式在Activity的onStart和onStop里通知Presenter一下让Presenter决定要不要继续回调View。第三个坑是Model层没有做返回数据模型转换导致界面展示逻辑渗透到Model层。我见过很多MVP代码里Model返回的是从网络请求拿到的原始数据某个字段是空字符串还是null需要界面前处理。这种情况不如让Model返回一个已经经过转换的、界面可直接使用的数据对象这样View层能更纯粹。5.2 对新人学习MVP的建议首先如果是从零开始学我建议不要直接抄网上的大型MVP框架。自己从最简单的一个页面开始先写一个不带任何抽象层的MVP跑通之后再尝试把重复逻辑抽出来。这个从朴素到抽象的过程比直接看别人封装好的BaseMvpActivity要有效得多。其次学习MVP的时候一定要配套写单元测试。哪怕是最简单的Presenter逻辑也能让你深刻理解接口抽象的价值。如果你发现某些代码很难测试通常说明它们的职责边界分得还不够好这时候就该回头调整设计了。最后MVP不一定要整套使用。我现在的项目里就有一段MVP风格的代码当页面逻辑简单到只需要一个方法传递时我不会硬套Presenter三层。架构模式是工具箱里的工具你需要知道每把工具适合什么场景而不是看什么场景都觉得应该用同一把锤子。最后再给一个实用小技巧面试前一定自己动手画一遍MVP的数据流向图不需要用工具手写或者纸画都行。面试官让你讲MVP时直接用图表达View发起事件Presenter处理业务Model返回数据Presenter回调View。这张图讲清楚整个MVP的理解就到位了问再多衍生问题你也接得住。

相关新闻

TDA7050 双通道音频功率放大器

TDA7050 双通道音频功率放大器

一、产品概述TDA7050 是一款双通道低电压音频功率放大器集成电路,专为电池供电的便携式音频设备设计。该芯片采用高度集成化架构,内部集成偏置电路、前置放大器、双通道功率输出级及保护电路,无需任何外部元件即可构成完整的音频放大系统。产…

2026/10/17 6:29:56 阅读更多 →
CKEditor 4 Table Selection 插件右键点击清除单元格选择的修复原理与测试详解

CKEditor 4 Table Selection 插件右键点击清除单元格选择的修复原理与测试详解

前端UI组件 【免费下载链接】ckeditor4 The best enterprise-grade WYSIWYG editor. Fully customizable with countless features and plugins. 项目地址: https://gitcode.com/gh_mirrors/ck/ckeditor4 点击查看 免费下载 本篇文章围绕 CKEditor 4 中 tableselec…

2026/10/17 6:29:56 阅读更多 →
EXPLAIN执行计划深度解析:慢SQL排查与索引优化实战指南

EXPLAIN执行计划深度解析:慢SQL排查与索引优化实战指南

一条SQL从300毫秒变成3秒,这种事我遇到过不止一次。遇到这种慢性查询,绝大多数人第一反应都是EXPLAIN一把梭,但真正把EXPLAIN每个字段都看明白的人却不多。绝大多数情况下,我们只看有没有出现ALL、有没有Using filesort&#xff0…

2026/10/17 6:29:56 阅读更多 →

最新新闻

iOS地图定位Demo拆解:CoreLocation+MapKit权限、坐标系与调试避坑指南

iOS地图定位Demo拆解:CoreLocation+MapKit权限、坐标系与调试避坑指南

简介:这是一份iOS地图定位示例工程,专门面向刚接触Core Location与MapKit的移动开发初学者,帮助解决在iOS应用中获取用户当前位置、并将定位结果标注到地图上的基础需求,适合作为入门练习和功能演示的参考模板。压缩包共23个文件&…

2026/10/17 7:00:02 阅读更多 →
C++五子棋源码解析:人机/人人双模式与AI博弈实现

C++五子棋源码解析:人机/人人双模式与AI博弈实现

简介:一套用C实现的五子棋对战程序源码包,同时支持人机与人人两种模式,适合C初学者和游戏开发入门者学习类的设计、AI决策算法以及图形界面交互,可作为第一个完整的游戏练手项目。压缩包共收录7个文件,整体仅106KB&…

2026/10/17 7:00:02 阅读更多 →
Java学生宿舍管理系统毕设:JSP+Servlet+MySQL设计与实现详解

Java学生宿舍管理系统毕设:JSP+Servlet+MySQL设计与实现详解

简介:这套基于Java的学生宿舍管理系统以SpringBoot为后台框架,采用Bootstrap构建前端界面,搭配MySQL数据库,适合高校毕业设计、课程实训以及刚接触后台管理系统的Java开发者。系统按角色划分三个入口:管理员可对学生、…

2026/10/17 7:00:02 阅读更多 →
模糊控制不再玄学:自适应模糊器从设计到调参避坑指南

模糊控制不再玄学:自适应模糊器从设计到调参避坑指南

简介:面向控制工程学习者与研究人员,围绕模糊控制及自适应模糊器设计,提供MATLAB Simulink环境下的完整实现方案,解决非线性系统智能控制建模与参数自整定问题,适用于课程设计、毕业设计及工程预研等场景。压缩包共426…

2026/10/17 7:00:02 阅读更多 →
Windows版Hydra实战:从环境配置到弱口令检测的完整指南

Windows版Hydra实战:从环境配置到弱口令检测的完整指南

简介:面向Windows平台的Hydra暴力破解工具及配套密码字典合集,专为渗透测试人员、安全运维及口令安全研究者在授权环境下进行登录口令强度检测而准备。包内含完整可运行的hydra.exe及全套DLL运行库,另附密码检查工具、辅助脚本、示例文件等&a…

2026/10/17 7:00:02 阅读更多 →
P4开发环境配置指南:bmv2、p4c与protobuf、thrift版本搭配实战

P4开发环境配置指南:bmv2、p4c与protobuf、thrift版本搭配实战

简介:面向P4可编程数据平面开发者与SDN实验学生的离线安装包合集,涵盖behavioral-model、gmock-1.7.0、p4c、protobuf-3.2.0、thrift-0.9.2等关键组件,用来解决P4语言工具链因版本严格匹配而难以独立装配的问题。压缩包采用gz格式&#xff0c…

2026/10/17 6:59:02 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/16 14:23:36 阅读更多 →