当前位置: 首页 > news >正文

深入解析:RxJava在Android中的应用

深入解析:RxJava在Android中的应用

文章目录

    • 1.1 与 Retrofit 结合
    • 1.2 与 MVP/MVVM 架构结合
      • 1.2.1 与 MVP (Model-View-Presenter) 结合
      • 1.2.2 RxJava 与 MVVM (Model-View-ViewModel) 结合
    • 1.3. RxBus (事件总线)
    • 1.4. 错误处理与资源管理
    • 1.5 复杂任务编排
      • 1.5.1 并行任务合并(zip 操作符)
      • 1.5.2. 顺序任务合并(concat 操作符)
      • 1.5.3. 动态数据流合并(merge 操作符)
      • 1.5.4. 最新数据合并(combineLatest 操作符)
    • 1.6 UI 事件处理
      • 1.6.1 防抖优化搜索输入:

将 RxJava 融入到实际项目架构中,解决复杂问题。

1.1 与 Retrofit 结合

Retrofit 官方支持返回 Observable 或 Flowable,是处理网络请求的黄金搭档。

public interface ApiService {
@GET("users/{id}")
Observable getUser(@Path("id") int id);
}
// 使用
apiService.getUser(123)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
user -> { /* 处理成功 */ },
error -> { /* 处理错误 */}
);

1.2 与 MVP/MVVM 架构结合

将 RxJava 与 MVP 或 MVVM 架构结合使用,是现代 Android(以及 Java Swing)开发中的最佳实践之一。这种结合能充分发挥各自的优势:架构模式负责清晰的职责分离和可测试性,而 RxJava 则优雅地处理异步、事件流和复杂的线程切换。

1.2.1 与 MVP (Model-View-Presenter) 结合

MVP 的核心思想是将 Activity/Fragment (View) 从繁重的业务逻辑中解放出来,使其只负责 UI 的展示和用户交互的传递。Presenter 作为中间层,负责处理业务逻辑并与 Model 层交互。

// 1. 定义 View 接口
public interface UserView {
void showLoading();
void hideLoading();
void showUsers(List<
User> users);
void showError(String message);
}
// 2. Model 层 (返回 RxJava 数据流)
public class UserModel
{
private ApiService apiService;
// 假设使用 Retrofit
public Observable<
List<
User>
> getUsers() {
return apiService.getUsers() // 返回 Observable<List<User>>.subscribeOn(Schedulers.io());// 在 IO 线程执行网络请求}}// 3. Presenter 层 (核心: 处理 RxJava 链)public class UserPresenter{private UserView view;private UserModel model;private CompositeDisposable disposables = new CompositeDisposable();public UserPresenter(UserView view, UserModel model) {this.view = view;this.model = model;}public void loadUsers() {view.showLoading();// 建立 RxJava 订阅disposables.add(model.getUsers().observeOn(AndroidSchedulers.mainThread()) // 切换到主线程更新 UI.subscribe(users ->{view.hideLoading();view.showUsers(users);// 成功: 更新 UI},error ->{view.hideLoading();view.showError("加载失败: " + error.getMessage());// 失败: 显示错误}));}// 在 Activity/Fragment onDestroy 时调用,防止内存泄漏public void onDestroy() {disposables.clear();}}// 4. View 层 (Activity/Fragment)public class UserActivityextends AppCompatActivity implements UserView {private UserPresenter presenter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_user);// 初始化 Presenterpresenter = new UserPresenter(this, new UserModel());// 触发加载presenter.loadUsers();}@Overrideprotected void onDestroy() {super.onDestroy();presenter.onDestroy();// 关键: 取消所有订阅}// 实现 View 接口方法@Overridepublic void showLoading() {// 显示进度条}@Overridepublic void hideLoading() {// 隐藏进度条}@Overridepublic void showUsers(List<User> users) {// 更新 RecyclerView 或 ListView}@Overridepublic void showError(String message) {// 弹出 Toast 或 Snackbar}}
  • 优势:
    职责清晰: View 只管展示,Presenter 处理逻辑和数据流。
    易于测试: Presenter 不依赖 Android 组件,可以方便地进行单元测试。
    异步处理优雅: RxJava 完美解决了网络请求、数据库操作等异步问题。

  • 挑战:
    内存泄漏: 必须妥善管理 Disposable,在生命周期结束时取消订阅。
    Presenter 膨胀: 如果业务逻辑复杂,Presenter 可能会变得非常庞大。可以通过引入 Interactor (或称 Use Case) 层来分担业务逻辑。

1.2.2 RxJava 与 MVVM (Model-View-ViewModel) 结合

MVVM 通过 数据绑定 (Data Binding) 或 LiveData/StateFlow 将 View 与 ViewModel 解耦。View 通过观察 ViewModel 中的数据变化来自动更新 UI,ViewModel 则负责准备和管理这些数据。

RxJava 可以作为 ViewModel 内部处理异步数据流的强大工具,最终将结果暴露给 View。由于 Android 官方推荐在 MVVM 中使用 LiveData,而 LiveData 本身不是响应式流,我们通常使用 LiveDataReactiveStreams 工具类进行桥接。

// 1. Model 层 (同 MVP)
public class UserModel
{
public Observable<
List<
User>
> getUsers() {
return apiService.getUsers()
.subscribeOn(Schedulers.io());
}
}
// 2. ViewModel 层 (核心: 使用 RxJava 处理逻辑,输出 LiveData)
public class UserViewModel
extends ViewModel {
private UserModel model;
// 暴露给 View 的 LiveData
private MutableLiveData<
List<
User>
> usersLiveData = new MutableLiveData<
>();
private MutableLiveData<
Boolean> loadingLiveData = new MutableLiveData<
>();
private MutableLiveData<
String> errorLiveData = new MutableLiveData<
>();
// 提供 LiveData 给 View 观察
public LiveData<
List<
User>
> getUsers() {
return usersLiveData;
}
public LiveData<
Boolean> isLoading() {
return loadingLiveData;
}
public LiveData<
String> getError() {
return errorLiveData;
}
public UserViewModel(UserModel model) {
this.model = model;
}
public void loadUsers() {
loadingLiveData.setValue(true);
// 将 RxJava Observable 转换为 LiveData
LiveData<
List<
User>
> liveData = LiveDataReactiveStreams.fromPublisher(
model.getUsers()
.toFlowable(BackpressureStrategy.LATEST) // 转换为 Flowable 以支持背压
.observeOn(AndroidSchedulers.mainThread()) // 确保在主线程发射
);
// 订阅这个 LiveData
liveData.observeForever(users ->
{
loadingLiveData.setValue(false);
usersLiveData.setValue(users);
});
// 你也可以直接订阅 Observable,并手动设置 LiveData
/*
model.getUsers()
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
users -> {
loadingLiveData.setValue(false);
usersLiveData.setValue(users);
},
error -> {
loadingLiveData.setValue(false);
errorLiveData.setValue(error.getMessage());
}
);
*/
}
@Override
protected void onCleared() {
super.onCleared();
// ViewModel 被销毁时,LiveDataReactiveStreams 会自动取消订阅
// 如果是手动 subscribe,需要在此处管理 Disposable
}
}
// 3. View 层 (Activity/Fragment)
public class UserActivity
extends AppCompatActivity {
private UserViewModel viewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_user);
viewModel = new ViewModelProvider(this).get(UserViewModel.class)
;
// 观察数据变化
viewModel.getUsers().observe(this, users ->
{
// 更新 UI,例如设置 Adapter
});
viewModel.isLoading().observe(this, isLoading ->
{
if (isLoading) {
// 显示加载框
} else {
// 隐藏加载框
}
});
viewModel.getError().observe(this, errorMsg ->
{
if (errorMsg != null) {
// 显示错误信息
}
});
// 触发加载
viewModel.loadUsers();
}
}
  • 优势:
    解耦更彻底: View 通过观察数据变化来更新,无需主动调用方法。
    生命周期感知: LiveData 和 StateFlow 能自动感知 Activity/Fragment 的生命周期,避免在非活跃状态下更新 UI。
    数据驱动 UI: UI 的状态完全由数据决定,逻辑更清晰。
  • 挑战:
    桥接成本: 需要将 RxJava 流转换为 LiveData 或 StateFlow,增加了复杂性。
    学习曲线: 需要同时理解 MVVM、数据绑定和 RxJava。

1.3. RxBus (事件总线)

利用 PublishSubject 或 BehaviorSubject 实现组件间的解耦通信。

public class RxBus {
private final PublishSubject bus = PublishSubject.create();
public void post(Object event) {
bus.onNext(event);
}
public  Observable toObservable(Class eventType) {
return bus.ofType(eventType);
}
}
// 发送事件
RxBus.getInstance().post(new UserLoginEvent("Alice"));
// 接收事件
RxBus.getInstance().toObservable(UserLoginEvent.class)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(event -> {
// 更新 UI
});

1.4. 错误处理与资源管理

• 全局错误处理: 使用 RxJavaPlugins.setErrorHandler(…) 设置全局错误处理器。
• CompositeDisposable: 管理多个 Disposable,在 Activity/Fragment 销毁时统一取消,避免内存泄漏。

private CompositeDisposable disposables = new CompositeDisposable();
// 添加订阅
disposables.add(apiService.getData().subscribe(...));
// 在 onDestroy 中清理
@Override
protected void onDestroy() {
super
.onDestroy();
disposables.clear(); // 取消所有订阅
}

1.5 复杂任务编排

RxJava 通过组合操作符(如 zip、merge、concat、combineLatest)实现多任务并行或串行执行,并合并结果。以下是典型场景与实现:

1.5.1 并行任务合并(zip 操作符)

场景:同时发起多个网络请求(如获取用户信息和订单列表),待所有请求完成后统一处理结果。

Observable<
User> userObservable = api.getUser();
Observable<
OrderList> orderObservable = api.getOrders();
Observable.zip(userObservable, orderObservable,
(user, orders) ->
new UserOrderResult(user, orders))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
result ->
showUserOrders(result),
error ->
handleError(error)
);

关键点:

zip 按顺序组合多个 Observable 的数据,生成新的数据项。
发射数据量以最慢的 Observable 为准,超出的数据会被丢弃。

1.5.2. 顺序任务合并(concat 操作符)

场景:依次执行多个任务(如先登录再获取数据),前一个任务失败则终止后续任务。
实现:

Observable.concat(
api.login(),
api.getData()
).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
data ->
processData(data),
error ->
handleError(error)
);

关键点:

concat 严格按顺序执行,前一个 Observable 完成后才会订阅下一个。
适合需要严格依赖关系的任务链。

1.5.3. 动态数据流合并(merge 操作符)

场景:合并多个动态数据源(如实时股票价格和用户操作日志),不保证顺序。
实现:

Observable<
StockPrice> priceObservable = api.getStockPrices();
Observable<
UserAction> actionObservable = api.getUserActions();
Observable.merge(priceObservable, actionObservable)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
event ->
logEvent(event),
error ->
handleError(error)
);

关键点:

merge 合并多个 Observable 的数据,按时间顺序发射,可能交错。
适合无严格顺序要求的实时数据流。

1.5.4. 最新数据合并(combineLatest 操作符)

场景:当两个输入框内容变化时,实时验证表单(如密码和确认密码是否一致)。
实现:

Observable<
String> passwordObservable = RxTextView.textChanges(passwordEditText)
.skipInitialValue()
.map(CharSequence::toString);
Observable<
String> confirmPasswordObservable = RxTextView.textChanges(confirmPasswordEditText)
.skipInitialValue()
.map(CharSequence::toString);
Observable.combineLatest(
passwordObservable,
confirmPasswordObservable,
(password, confirmPassword) -> password.equals(confirmPassword)
).subscribe(
isValid ->
showValidationResult(isValid),
error ->
handleError(error)
);

关键点

combineLatest 在任意一个源 Observable 发射新数据时,组合所有源的最新数据。
适合需要基于多个输入实时计算的场景。

1.6 UI 事件处理

1.6.1 防抖优化搜索输入:

RxView.clicks(submitButton)
.throttleFirst(1000, TimeUnit.MILLISECONDS) // 1秒内仅允许一次点击
.flatMap(voidEvent -> api.submitData(data))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
success ->
showSuccess(),
error ->
handleError(error)
);

相关文章:

深入解析:RxJava在Android中的应用

深入解析:RxJava在Android中的应用pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; …...

模型选择与配置说明

模型选择与配置说明(Detection / Recognition / Classification) 本文系统说明本项目在“检测(det)/识别(rec)/分类(cls)”三条子任务上的模型选择思路、备选方案对比、输入尺寸与性能取舍、部署格式(ONNX/MNN)、以及在 GUI 与代码层面的配置方式。目标是让读者理解“…...

梯度下降算法

Gradient Descent 梯度下降一、核心思想:一个最经典的比喻 想象一下,你是一个蒙着眼睛的登山者,被困在一片漆黑的山林中。你的目标是走到山谷的最低点(寻找最低点)。 你会怎么做?你会用脚感受一下周围的地面,找出哪个方向是“下坡”最陡的。然后朝着那个最陡的下坡方向迈…...

002_文本分类任务的问答

1、下面代码中,random_state作为随机种子作用是什么? train_x, valid_x, train_y, valid_y = model_selection.train_test_split(trainDF[text], trainDF[label], test_size=0.25, random_state=42)这段代码的作用是随机把数据分为两个部分 计算机的“随机数”其实是 伪随机数…...

车牌识别

车牌识别方案对比与实现总结(GUI 三方法:lock / test / rec2) 本文面向实际工程应用,系统梳理当前 GUI 集成的三种车牌识别方法(lock、test、rec2)的技术亮点、设计思路、模型选择、实现过程与关键代码,帮助快速理解与持续优化。目标是:在统一界面中,对比“传统候选+文…...

告别人工标注瓶颈!Reward-RAG:用 CriticGPT 打造更懂人类偏好的检索模型

Reward-RAG: Enhancing RAG with Reward Driven Supervision 全文摘要 本文介绍了一种名为Reward-RAG的新方法,旨在通过奖励驱动监督增强Retrieval-Augmented Generation(RAG)模型。与以往的RAG方法不同,该方法使用了CriticGPT训练了一个专门的奖励模型,并利用该模型生成合…...

在AI技术快速实现创想的时代,挖掘前端学习新需求成为关键——某知名编程教育平台需求洞察

本文分析了一个包含50个前端项目的编程学习资源,涵盖交互设计、动画效果和实用工具等多种类型,通过用户反馈发现了界面优化、功能扩展和教学改进等方面的潜在需求。a.内容描述 该项目是一个包含50个独立前端项目的编程学习资源,核心功能定位在于通过实际项目练习帮助开发者掌…...

Latex 中百分号怎么打

Latex 中百分号怎么打 由于 % 被用作注释符,所以前面 + \ 进行转义 \(\frac{285.5}{1-2.7\%}\)...

文件上传-条件竞争绕过

条件竞争原理: 条件竞争的逻辑是代码逻辑问题:当我们文件上传到服务器时,先对文件进行保存,然后对文件的后缀名进行判断,符合白名单的保存,不符合就删除,但在删除之前,有另一个对服务器发起的请求,要访问这个文件,那么就可能造成文件被读取和访问。这就是条件竞争。 …...

9.17 CSP-S模拟23/多校A层冲刺NOIP2024模拟赛19 改题记录

HZOJ 写在前面 连着三天吃三坨。本来想着今天大凶忌参加模拟赛然后没模拟赛挺好的,然后7:57临时通知加场,难道这就是大凶?好吧打就打吧,没想到真差点爆零。粗看没一道题可做怀疑自己的水平了然后赛后猛然醒悟是自己蠢如猪。其实这篇前面应该还有两篇,但是奈何这套改完得比…...

C++ 并发

C++ 并发编程是现代软件开发中的核心技术,主要用于利用多核处理器提升程序性能。C++11 及后续标准引入了完善的并发库(<thread>、<mutex>、<condition_variable> 等),使开发者能更安全地编写多线程程序。 1、std::thread std::thread 是 C++11 引入的线程…...

UML 5章

UML是建模语言,能够用面向对象的方法描述任何类型的系统 UML时序图:他通过对象之间发送消息的时间顺序显示多个对象之间的动态协作,重在对象之间的交互,强调时间顺序例UML状态图例...

《微服务事务管理》 - 教程

《微服务事务管理》 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-siz…...

python之socket udp服务器实现

import socket# 1. 创建 UDP Socket (SOCK_DGRAM 表示 UDP) receiver_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 2. 绑定地址和端口 receiver_address = (, 1883) # 端口号 9999 receiver_socket.bind(receiver_address)print("UDP 接收方已启动,等待…...

kylin SP3安装mysql 8.4.5

环境:OS:kylin SP3mysql:8.4.5 glibc2.17,建议安装glibc.2.28版本 查看系统glibc版本[root@localhost ~]# ldd --versionldd (GNU libc) 2.28Copyright (C) 2018 自由软件基金会。这是一个自由软件;请见源代码的授权条款。本软件不含任何没有担保;甚至不保证适销性或者适合某…...

Unity中是否可以禁用GC

1)Unity中可以禁用GC吗2)项目是URP管线,渲染模块CPU耗时高,经排查主要是Batches数过高,应怎样进一步排查和优化渲染批次这是第445篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面地掌握和学习。 UWA社区主页:co…...

经典SQL语句大全

经典SQL语句大全一、基础1、说明:创建数据库CREATE DATABASE database-name2、说明:删除数据库drop database dbname3、说明:备份sql server--- 创建 备份数据的 deviceUSE masterEXEC sp_addumpdevice disk, testBack, c:\mssql7backup\MyNwind_1.dat--- 开始 备份BACKUP D…...

IvorySQL 与 deepin 完成兼容性认证,共创开源生态新篇章

近日,IvorySQL 与 deepin 操作系统成功完成了兼容性适配认证。这一里程碑式的成就标志着 IvorySQL 在国产操作系统生态中的进一步深化,为用户提供更稳定、高效的数据库解决方案。deepin 简介 深度操作系统 deepin 是一款以“简洁、美观、易用”著称的国产 Linux 发行版,拥有…...

在 Nginx 上搭建静态站点

1、新建站点的配置文件 vi /etc/nginx/conf.d/www.xxx.com.conf2、写入如下内容: server {listen 80;#listen [::]:80;server_name www.xxx.com; # 这里可以写你的域名,或者 _ 表示匹配所有 root /var/www/www.xxx.com; # 你的静态文件目录 index index.html index.htm;locat…...

使用GitHub Dork快速发现漏洞:我的第一个Bugcrowd漏洞挖掘实战

本文详细介绍了如何通过GitHub Dork技术快速发现企业敏感信息泄露漏洞,包含实用的搜索语法和实际案例,帮助安全研究人员高效挖掘漏洞。使用GitHub Dork快速发现漏洞:我的第一个Bugcrowd漏洞挖掘实战 嗨,黑客们,漏洞猎人们! 祝愿你们发现大量漏洞并获得丰厚奖励! 虽然距离…...

kylin SP3安装mysql8.0.41

环境:OS:kylin SP3mysql:8.0.41 glibc2.17,建议安装glibc.2.28版本 查看系统glibc版本[root@localhost ~]# ldd --versionldd (GNU libc) 2.28Copyright (C) 2018 自由软件基金会。这是一个自由软件;请见源代码的授权条款。本软件不含任何没有担保;甚至不保证适销性或者适合某…...

DIFY 项目中通过 Makefile 调用 Dockerfile 并采用 sudo make build-web 命令构建 web 镜像的方法和注意事项

DIFY 项目中通过 Makefile 调用 Dockerfile 并采用 sudo make build-web 命令构建 web 镜像的方法和注意事项pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas",…...

代码随想录算法训练营第一天 | 704. 二分查找、27. 移除元素、209.长度最小的子数组

704. 二分查找 思路:刷过很多次了,就是双指针思想,初始化一个在数组最左边的指针index_l,一个在最右边的指针index_r,当index_l < index_r 的时候通过判断index_l 和 index_r所确定的区间,缩小区间,最后夹逼出我们的目标值。 注意的点:最终状态会有两个 :1.l与r相等…...

从 MLPerf Storage v2.0 看 AI 训练中的存储性能与扩展能力

8 月 5 日,全球权威 AI 工程联盟 MLCommons 发布了最新的 MLPerf Storage v2.0 基准测试结果。本次评测吸引了众多厂商参与,包括 Cloud、Shared File、Fabric-Attached Block、Direct-Attached Block 这几大类存储厂商。 由于各厂商在硬件配置、节点规模和应用场景上的差异,…...

Revit二次开发 钢筋生成API(二)

2、自由钢筋生成API 创建一条无约束的自由形状钢筋。之后无法对该钢筋添加约束。public static Rebar CreateFreeForm(Document doc,RebarBarType barType,Element host,IList<IList<Curve>> curves,out RebarFreeFormValidationResult error )这个合自由钢筋生成A…...

创建会计凭证报错:FI/CO接口:待更新的不一致的FI/CO凭证标题数据(转)

问题:使用过账BAPI_ACC_DOCUMENT_POST,自动过账时,报错原因是“FI/CO接口:待更新的不一致的FI/CO凭证标题数据”。 原因: 1、如果头数据里面的公司和行项目公司是一致的,检查行项目,不要对行项目赋公司bukrs。 "it_item-comp_code = wa_account-bukrs. 2、检查金额是…...

Uri uri = new Uri(Path); 这行代码的作用

1. 语法校验 字符串里只要多一个空格、少一个 /、中文没转义,后面 HttpClient 会直接炸。 Uri 构造函数会第一时间给你抛 UriFormatException,早发现早处理。 2. 把“一串字符”升级成“有结构的零件箱” 转成 Uri 后,你就能直接拿这些字段,而不用再 Substring、IndexOf 去…...

Qt函数方法传入参数未使用-警告warning错误error提示解决

前言全局说明某些情况下,函数(方法)会传入参数,但并不一定会使用, 但是,不使用编辑器又会警告一、说明 1.1 环境: Windows 7 旗舰版 Visual Studio 2013二、未使用参数解决 原型 Q_UNUSED(未使用参数)三、示例 3.1 文件名: public:MyThread(QWidget *parent = nullptr){Q_…...

mysql 性能监控,关键指标解析与优化案例剖析

你是否经历过数据库突然变慢却无从下手的困境?某金融平台曾因慢查询堆积导致交易响应暴增300%,某电商大促期间因缓冲池命中率骤降引发订单延迟。性能问题往往具备隐蔽性和突发性特征,本文将揭示MySQL监控的核心参数与实战诊断方法。 连接池监控是性能防护的第一道防线。Thre…...

设计模式

1.分类 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享 元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责…...

Rhinoceros 8.23.25251.13001 犀牛3D建模

描述 Rhinoceros 是由美国Robert McNeel公司最新出品的专业强大的3D建模软件。软件以集百家之长为一体的发展教育理念,拥有NURBS的优秀传统建模教学方法,也有一个网格进行建模插件T-Spline,使建模方式方法有了更多的挑选,然后能创建出更传神、生动的造型。能输入和输出几十…...

Git 常用操作指南

本文为你整理了 Git 的常用操作,无论你是刚接触 Git 还是需要快速查阅,这篇指南都能帮你高效管理代码版本。 🔧 初始配置 开始使用 Git 前,先配置你的用户信息: git config --global user.name "你的用户名" git config --global user.email "你的邮箱&qu…...

《深入理解计算机系统》计算机系统漫游(一) - Invinc

本文记录《深入理解计算机系统》中第1章 计算机系统漫游 的一些知识点。本文记录《深入理解计算机系统》中第1章 计算机系统漫游 的一些知识点。第1章 计算机系统漫游 信息就是位+上下文 系统中所有的信息——包括磁盘文件、内存中的程序、内存中存放的用户数据以及网络上传送的…...

从几何分离到语义理解:深度解析3D点云分割与语义分割的本质区别

在三维计算机视觉领域,3D点云作为真实世界场景的核心数据载体,其处理技术直接决定了机器感知环境的精度与效率。 其中,3D点云分割与语义分割是两类关键技术,尽管二者同属点云处理范畴,但在目标定位、信息输出与应用价值上存在本质差异。 前者专注于“几何层面的分离”,通…...

欧拉筛(线性筛)算法分析

前言对于寻找素数,第一时间想到的便是二重循环暴力查找,其复杂度O(n^2),通过循环中只判断到根号n可以优化一些,不过复杂度也达不到预期。在数论的学习中,我学到了埃氏筛法,O(nloglogn)的算法,而在一些数据范围达到1e7这样的题目中,也很难让人满意,于是我便学习了欧拉筛…...

2021年安徽省大数据与人工智能应用竞赛 大数据(网络赛)-高职组赛题

本套数据数据: 通过网盘分享的文件: 链接: https://pan.baidu.com/s/1ZQXoWQhCOAiGVcFOZozV1g?pwd=json 提取码: json 第二部分:大数据程序编写部分(30分) 任务一、数据抽取转化部分(5分) 1、使用sqoop将MySQL的sakila数据库中的city表中city列以C开头的数据导入到hdfs…...

Alexandresku设计的loki小对象内存分配器

Loki是由 Alexandresku 编写的一个与《Modern C++ Design》(C++设计新思维)一书配套发行的C++代码库。其中有两个文件 SmallObj.h 、SmallObj.cpp 进行内存管理,可以单独进行使用 三个class,第一层是chunk,第二层是vector<chunk> FixedAllocator,第三层是vector&l…...

C++ 内存管理

C++ 内存管理是程序设计的核心环节,直接影响程序的性能、稳定性和安全性。C++ 不像 Java、Python 等语言有自动垃圾回收机制,而是需要开发者手动管理动态内存(或通过智能指针等机制自动管理)。 1、C++ 内存分区内存区域 存储内容 生命周期 管理方式栈 (Stack) 函数参数、局…...

一些写了和没写的数学!

P8114 [Cnoi2021] 六边形战士 传送 非常好玩的题! 首先你大概率看过一些“无字证明”,其中很经典的是这个: 证明:用若干个边长为 \(1\),顶角为 \(60\) 度的菱形拼成一个边长为 \(n\) 的正六边形,三个方向的菱形个数一定相等。这是一个经典的无字证明,虽然前置的说明要费…...

【光照】[自发光Emission]以UnityURP为例

【从UnityURP开始探索游戏渲染】专栏-直达自发光的基本原理 $Cemissive=Memissive$ 自发光是物体表面主动发射光线的现象,在光照模型中通常作为独立于外部光源的附加项。其核心特点是不受其他光照影响,但可以影响周围环境。 实现流程‌定义发射颜色和强度‌:确定基础发光颜色…...

mybatis-plus初体验,解决报错Invalid value type for attribute factoryBeanObjectType: java.lang.String

解决报错Invalid value type for attribute factoryBeanObjectType: java.lang.String 推荐这位大佬的博客: https://www.cnblogs.com/muphy/p/18653627 项目结构MyBatis-Plus配置类MyBatisPlusConfig package com.example.config;import com.baomidou.mybatisplus.annotation…...

浅谈制氢电源及英飞凌解决方案

大家对氢元素肯定都不陌生,认识它基本都是从背元素周期表开始的。近年来我们身边多了很多氢的身影,从北京冬奥会的氢燃料电池大巴,再到广州南沙小虎岛电氢智慧能源站,氢也越来越被大家熟知。工业上,氢的使用可是一点都不少,自 1975 年以来,需求量增长了三倍,而且还在继…...

微算法科技(NASDAQ:MLGO)研究分布式量子计算,释放量子计算潜能

在信息时代,数据量呈指数级增长,经典计算机面临算力瓶颈。量子计算以其超强的并行处理能力,被视为下一世代计算范式的颠覆者。然而,单个量子处理器的脆弱性和制造难度限制了其广泛应用。微算法科技(NASDAQ:MLGO)研发团队研究通过分布式量子计算模型,将多个量子计算节点连…...

AI 重塑招聘三角:Moka 招聘智能体如何实现 HR、候选人与企业的三方共赢

AI 重塑招聘三角:Moka 招聘智能体如何实现 HR、候选人与企业的三方共赢在人才竞争进入白热化的今天,招聘早已不是 HR 单方面的 “筛选任务”,而是涉及 HR 效率、候选人体验、企业战略人才储备的三角关系。传统招聘模式下,这三角常常陷入 “HR 疲于奔命却难出成果、候选人等…...

Flash Attention原理

提出问题 Transformer 结构已成为自然语言处理和图像分类等应用中最常用的架构。尽管 Transformer 在规模上不断增大和加深,但处理更长上下文仍然是一个挑战,因为核心的自注意力模块在序列长度上具有二次方的时间和内存复杂度。这导致在处理长序列时速度变慢且内存需求巨大。…...

MSMQ 跨服务器读写队列的“消息队列系统的访问被拒绝”的解决方案

转:http://m.blog.csdn.net/blog/2000killer/8904852 在服务器上创建的Queue开发者的 机器只能写数据而不能读数据。.net给出的错误是“对消息队列系统的访问被拒绝”,也就是说拒绝访问队列没有相关权限,我给Everyone和 ANONYMOUS LOGON赋予全部权限都无法解决(正常情况下可…...

opencv学习记录1

img = cv2.imread(pic.jpg)#读图像 #封装函数 def cv_show(name,img):cv2.imshow(image,img)#显示图像cv2.waitKey(0)#显示时间cv2.destroyWindow()#读灰度图 img = cv2.imread(pic.jpg,cv2.IMREAD_GRAYSCALE) #保存 cv2.imwrite(name,img)#读视频 vc = cv2.VideoCapture(name)…...

kylin V10SP3安装mysql5.7.42

环境:OS:kylin V10SP3mysql:5.7.42查看系统glibc版本[root@localhost ~]# ldd --versionldd (GNU libc) 2.28Copyright (C) 2018 自由软件基金会。这是一个自由软件;请见源代码的授权条款。本软件不含任何没有担保;甚至不保证适销性或者适合某些特殊目的。由 Roland McGrath …...

MATLAB 仿真无线传感器网络(WSN)三大经典场景

一、统一参数区(建议先调这里) %% 0. 公共参数 clear; clc; close all; rng(2025) % 可重复 field = [0 100; 0 100]; % 100 m 100 m nNode = 200; % 节点数 R = 15; % 通信半径 /m E0 = 0.5; …...

9.05 DP 专题

Permutation Blackhole 按照过题人数顺序做题是这样的,如果要看难一点的建议向下 首先,不要读错题 QAQ 然后你现在发现每个位置只会在它被涂黑之前向最近放位置产生一次贡献,从 P 的角度思考是困难的,考虑从被涂黑的图的角度思考 你注意到我们每次涂完两个点之后,它们中间…...