RxBus简介 什么是RxBus? RxBus 名字看起来像一个库,但它并不是一个库,而是一种模式,它的思想是使用RxJava来实现了EventBus ,而让你不再需要使用 Otto 或者 GreenRobot 的 EventBus。------ 给 Android 开发者的 RxJava 详解 RxBus2.x就是基于RxJava2.x封装实现的类。 为什么要使用RxBus? 如上所说,我们可以通过封装RxJava实现EventBus。 随着RxJava在Android项目中的普及, 我们完全可以使用RxBus代替EventBus,减少库的引入,增加系统的稳定性。 EventBus虽然使用方便,但是在事件的生命周期的处理上需要我们利用订阅者的生命周期去注册和取消注册,这个部分还是略有麻烦之处。 而我们可以结合使用RxLifecycle来配置,简化这一步骤。 结合RxJava的强大能力和RxAndroid的进程调度,RxBus有更多更强大的功能。 Demo&代码 GitHub:https://github.com/homeven/Rxbus RxBus实现 Gradle implementation 'io.reactivex.rxjava2:rxjava:2.1.17' //RxJava implementation 'io.reactivex.rxjava2:rxandroid:2.0.2' //RxAndroid 1 2 封装RxJava实现RxBus Subject有两种用途: 做为observable向其他的observable发送事件 做为observer接收其他的observable发送的事件 我们要实现:事件总线、事件发布者以及事件订阅者。首先Subject既可以作为被观察者发送事件,也可以作为观察者接收事件,而RxJava内部的响应式的支持实现了事件总线的功能。 可以使用PublishSubject.create().toSerialized();生成一个Subject对象。 如下代码就实现了最基本的RxBus。 public class RxBus { private volatile static RxBus mDefaultInstance; private final Subject mBus; private RxBus() { mBus = PublishSubject.create().toSerialized(); } public static RxBus getInstance() { if (mDefaultInstance == null) { synchronized (RxBus.class) { if (mDefaultInstance == null) { mDefaultInstance = new RxBus(); } } } return mDefaultInstance; } /** * 发送事件 */ public void post(Object event) { mBus.onNext(event); } /** * 根据传递的 eventType 类型返回特定类型(eventType)的 被观察者 */ public Observable toObservable(final Class eventType) { return mBus.ofType(eventType); } /** * 判断是否有订阅者 */ public boolean hasObservers() { return mBus.hasObservers(); } public void reset() { mDefaultInstance = null; } } 使用RxBus 事件实体 public class MsgEvent { private String msg; public MsgEvent(String msg) { this.msg = msg; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } } 订阅事件 RxBus.getInstance().toObservable(MsgEvent.class).subscribe(new Observer() { @Override public void onSubscribe(Disposable d) { } @Override public void onNext(MsgEvent msgEvent) { //处理事件 } @Override public void onError(Throwable e) { } @Override public void onComplete() { } }); 发送事件 RxBus.getInstance().post(new MsgEvent("Java")); 与EventBus对比,除了订阅事件的消息处理,使用基本一样。 至于EventBus的线程模型,我们完全可以使用RxJava 的线程控制Scheduler来实现,具体可以参考上面RxJava的使用两篇文章。 RxBus内存泄漏 使用RxJava发布一个订阅后,当页面被finish,此时订阅逻辑还未完成,如果没有及时取消订阅,就会导致Activity/Fragment无法被回收,从而引发内存泄漏。 EventBus为了解决这个问题,要求我们根据订阅者的生命周期注册和取消注册。所以在RxBus中我们也可以这样操作。 简单处理 使用一个CompositeDisposable存储当前所有的订阅,然后再onDestroy()中将其dispose()。 private CompositeDisposable compositeDisposable; @Override protected void onCreate(Bundle savedInstanceState) { compositeDisposable = new CompositeDisposable(); RxBus.getInstance().toObservable(MsgEvent.class).subscribe(new Observer() { @Override public void onSubscribe(Disposable d) { compositeDisposable.add(d); } @Override public void onNext(MsgEvent msgEvent) { //事件处理 } @Override public void onError(Throwable e) { } @Override public void onComplete() { } }); } @Override public void onDestroy() { super.onDestroy(); unbinder.unbind(); if (compositeDisposable!=null && !compositeDisposable.isDisposed()){ compositeDisposable.dispose(); } } RxLifecycle Rxlifecycle 是trello开发的用于解决RxJava引起的内存泄漏的开源框架。 GitHub地址:https://github.com/trello/RxLifecycle 该框架为了适应不同的场景,开发了不同的版本,具体的可以查看GitHub文档: // RxLifecycle基础库 implementation 'com.trello.rxlifecycle2:rxlifecycle:2.2.2' // Android使用的库,可以绑定特定的生命周期 //需继承RxActvivty使用 implementation 'com.trello.rxlifecycle2:rxlifecycle-android:2.2.2' // Android组件库,里面定义了例如RxAppCompatActivity、 RxFragment之类的Android组件 // 须继承RxAppCompatActivity、RxFragment使用 implementation 'com.trello.rxlifecycle2:rxlifecycle-components:2.2.2' // 预先编写的支持首选项片段,将其子类化为提供者 implementation 'com.trello.rxlifecycle2:rxlifecycle-components- preference:2.2.2' // Android使用的库,须继承NaviActivity使用 implementation 'com.trello.rxlifecycle2:rxlifecycle-navi:2.2.2' // 使用Android生命周期作为提供者 //无需继承,任何有声明周期的组件都可以直接使用 implementation 'com.trello.rxlifecycle2:rxlifecycle-android- lifecycle:2.2.2' // Kotlin语法 implementation 'com.trello.rxlifecycle2:rxlifecycle-kotlin:2.2.2' //在Kotlin语法,使用Android生命周期 implementation 'com.trello.rxlifecycle2:rxlifecycle-android- lifecycle-kotlin:2.2.2' 如果我们自己有BaseActivity,所以不能继承RxActvivty,RxAppCompatActivity、RxFragment,NaviActivity。 为了保持代码的灵活性,我们使用: // 使用Android生命周期作为提供者 implementation 'com.trello.rxlifecycle2:rxlifecycle-android-lifecycle:2.2.2' 修改RxBus,添加如下代码: 使用compose(this.bindToLifecycle())方法绑定Activity的生命周期,在onStart方法中绑定,在onStop方法被调用后就会解除绑定,以此类推。 如果在onPause/onStop方法中绑定,那么就会在它的下一个生命周期方法(onStop/onDestory)被调用后解除绑定。 绑定 销毁 onCreate onDestory onStart onStop onResum onPause onPause onStop onStop onDestory /** * 使用Rxlifecycle解决RxJava引起的内存泄漏 */ public Observable toObservable(LifecycleOwner owner, final Class eventType) { LifecycleProvider provider = AndroidLifecycle.createLifecycleProvider(owner); return mBus.ofType(eventType).compose(provider. bindToLifecycle()); } 订阅事件时,添加上下文this即可绑定生命周期,自动取消订阅: RxBus.getInstance().toObservable(this,MsgEvent.class).subscrib e(new Consumer() { @Override public void accept(MsgEvent msgEvent) throws Exception { //处理事件 } }); RxBus的粘性事件 EventBus有粘性事件,RxBus也可以实现。 修改RxBus修改&添加如下代码: private final Map, Object> mStickyEventMap; private RxBus() { mBus = PublishSubject.create().toSerialized(); mStickyEventMap = new ConcurrentHashMap<>(); } /** * 发送一个新Sticky事件 */ public void postSticky(Object event) { synchronized (mStickyEventMap) { mStickyEventMap.put(event.getClass(), event); } post(event); } /** * 根据传递的 eventType 类型返回特定类型(eventType)的 被观察者 * 使用Rxlifecycle解决RxJava引起的内存泄漏 */ public Observable toObservableSticky(LifecycleOwner owner,final Class eventType) { synchronized (mStickyEventMap) { LifecycleProvider provider = AndroidLifecycle.createLifecycleProvider(owner); Observable observable = mBus.ofType(eventType).compose(provider.bindToLifecycle()); final Object event = mStickyEventMap.get(eventType); if (event != null) { return observable.mergeWith(Observable.create(new ObservableOnSubscribe() { @Override public void subscribe(ObservableEmitter subscriber) throws Exception { subscriber.onNext(eventType.cast(event)); } })); } else { return observable; } } } /** * 根据eventType获取Sticky事件 */ public T getStickyEvent(Class eventType) { synchronized (mStickyEventMap) { return eventType.cast(mStickyEventMap.get(eventType)); } } /** * 移除指定eventType的Sticky事件 */ public T removeStickyEvent(Class eventType) { synchronized (mStickyEventMap) { return eventType.cast(mStickyEventMap.remove(eventType)); } } /** * 移除所有的Sticky事件 */ public void removeAllStickyEvents() { synchronized (mStickyEventMap) { mStickyEventMap.clear(); } } RxBus完整代码 public class RxBus { private volatile static RxBus mDefaultInstance; private final Subject mBus; private final Map, Object> mStickyEventMap; private RxBus() { mBus = PublishSubject.create().toSerialized(); mStickyEventMap = new ConcurrentHashMap<>(); } public static RxBus getInstance() { if (mDefaultInstance == null) { synchronized (RxBus.class) { if (mDefaultInstance == null) { mDefaultInstance = new RxBus(); } } } return mDefaultInstance; } /** * 发送事件 */ public void post(Object event) { mBus.onNext(event); } /** * 使用Rxlifecycle解决RxJava引起的内存泄漏 */ public Observable toObservable(LifecycleOwner owner, final Class eventType) { LifecycleProvider provider = AndroidLifecycle.createLifecycleProvider(owner); return mBus.ofType(eventType).compose(provider.bindToLifecycle()); } /** * 判断是否有订阅者 */ public boolean hasObservers() { return mBus.hasObservers(); } public void reset() { mDefaultInstance = null; } /** * Stciky 相关 */ /** * 发送一个新Sticky事件 */ public void postSticky(Object event) { synchronized (mStickyEventMap) { mStickyEventMap.put(event.getClass(), event); } post(event); } /** * 根据传递的 eventType 类型返回特定类型(eventType)的 被观察者 * 使用Rxlifecycle解决RxJava引起的内存泄漏 */ public Observable toObservableSticky(LifecycleOwner owner,final Class eventType) { synchronized (mStickyEventMap) { LifecycleProvider provider = AndroidLifecycle.createLifecycleProvider(owner); Observable observable = mBus.ofType(eventType).compose(provider.bindToLifecycle()); final Object event = mStickyEventMap.get(eventType); if (event != null) { return observable.mergeWith(Observable.create(new ObservableOnSubscribe() { @Override public void subscribe(ObservableEmitter subscriber) throws Exception { subscriber.onNext(eventType.cast(event)); } })); } else { return observable; } } } /** * 根据eventType获取Sticky事件 */ public T getStickyEvent(Class eventType) { synchronized (mStickyEventMap) { return eventType.cast(mStickyEventMap.get(eventType)); } } /** * 移除指定eventType的Sticky事件 */ public T removeStickyEvent(Class eventType) { synchronized (mStickyEventMap) { return eventType.cast(mStickyEventMap.remove(eventType)); } } /** * 移除所有的Sticky事件 */ public void removeAllStickyEvents() { synchronized (mStickyEventMap) { mStickyEventMap.clear(); } } } Demo 该Demo演示了使用RxBus完成Activty与Fragment的通信。 这里写图片描述 public class RxActivity extends AppCompatActivity { @BindView(R.id.java) Button java; @BindView(R.id.android) Button android; @BindView(R.id.rx_layout) FrameLayout rxLayout; private FragmentManager fragmentManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_rx); ButterKnife.bind(this); fragmentManager = getSupportFragmentManager(); FragmentTransaction transaction = fragmentManager.beginTransaction(); transaction.add(R.id.rx_layout, new RxFragment()); transaction.commit(); } @OnClick({R.id.java, R.id.android}) public void onViewClicked(View view) { switch (view.getId()) { case R.id.java: RxBus.getInstance().post(new MsgEvent("Java")); break; case R.id.android: RxBus.getInstance().post(new MsgEvent("Android")); break; } } } public class RxFragment extends Fragment { @BindView(R.id.text) TextView text; Unbinder unbinder; private View view; @SuppressLint("CheckResult") @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { view = inflater.inflate(R.layout.fragment_rx, container, false); unbinder = ButterKnife.bind(this, view); RxBus.getInstance().toObservable(this,MsgEvent.class).subscribe(new Consumer() { @Override public void accept(MsgEvent msgEvent) throws Exception { //处理事件 } }); return view; } } 参考 RxBus 简单使用学习 https://www.2cto.com/kf/201708/674041.html 你可能感兴趣的:(Rxbus讲解) 【精华推荐】AI大模型学习必逛的十大顶级网站 大模型入门学习 人工智能学习大模型入门llama大模型教程大模型学习大模型 随着人工智能技术的快速发展,AI大模型(如GPT-3、BERT等)在自然语言处理、计算机视觉等领域取得了显著的成果。对于希望深入学习AI大模型的开发者和研究者来说,找到合适的学习资源至关重要。本文将为大家推荐十大必备网站,帮助你更好地理解和应用AI大模型。1.CourseraCoursera是一个在线学习平台,提供各类AI和机器学习课程,包括斯坦福大学的机器学习课程和深度学习专项课程。通过视频讲解 HarmonyNext实战:基于ArkTS的跨平台音视频播放器开发 harmonyos-next HarmonyNext实战:基于ArkTS的跨平台音视频播放器开发引言在HarmonyNext生态系统中,音视频处理是一个重要且复杂的领域。本文将深入探讨如何使用ArkTS语言开发一个跨平台的音视频播放器,涵盖从音视频解码到播放控制的完整流程。我们将通过一个实战案例,详细讲解如何利用HarmonyNext的多媒体能力,结合ArkTS的现代语法,构建一个高效、灵活的音视频播放器。1.项目概述1.1目 【数据库初阶】MySQL中表的约束(上) bsefef 面试学习路线阿里巴巴数据库mysqlandroid ??博主首页:??专栏首页:数据库初阶??其它专栏:C++初阶|C++进阶|初阶数据结构亲爱的小伙伴们,大家好!在这篇文章中,我们将深入浅出地为大家讲解MySQL中表的约束帮助您轻松入门,快速掌握核心概念。如果文章对您有所启发或帮助,请别忘了点赞??、收藏??、留言??支持!您的每一份鼓励,都是我持续创作的源动力。让我们携手前行,共同进步!文章目录@[toc]`0.什么是表的约束``1.NULL& 成为LLM大师的必读书籍:这几本大模型书籍,详细到让你一篇文章就收藏足够 AGI大模型老王 产品经理大模型教程学习大模型人工智能LLM大模型书籍 以下是几本关于大模型和人工智能领域的经典书籍,它们各自具有独特的特点和适用人群:《深度学习》(DeepLearning)作者:伊恩·古德费洛(IanGoodfellow)、约书亚·本吉奥(YoshuaBengio)、亚伦·库维尔(AaronCourville)简介:《深度学习》是深度学习领域的经典之作,全面介绍了深度学习的基础知识、主要模型及其应用。书中详细讲解了神经网络、卷积神经网络、循环神经网 软件工程/计算机科学与技术专业毕业设计选题 计算机毕设选手 计算机毕设选题推荐案例课程设计软件工程springboot开发语言java后端spring 博主介绍:✌全网粉丝30W+,CSDN全栈领域优质创作者,博客之星、掘金/华为云/阿里云等平台优质作者,计算机毕设实战导师。目前专注于大学生项目实战开发,讲解,毕业答疑辅导✌主要服务内容:选题定题、开题报告、任务书、程序开发、文档编写和辅导、文档降重、程序讲解、答辩辅导等,欢迎咨询~文末获取源码+数据库+文档感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及文档编写等相关问题都可以给我沟通,希望 AI学习预备知识-数据操作(3)广播机制 羞涩的小吉他 人工智能学习 AI学习预备知识-数据操作(3)广播机制提示:本系列持续更新中文章目录AI学习预备知识-数据操作(3)广播机制前言广播机制总结前言随着开始人工智能的学习越来越多,那么再学习过程中,我们应该有一定的基础知识储备,本系列为基础知识储备介绍,在以往系列中我们提到了相同形状的张量按元素操作,那不同形状的张量操作就涉及到本文主要讲解AI学习储备知识–广播机制。广播机制提示:默认使用python,数据操作使用 大模型的实践应用30-大模型训练和推理中分布式核心技术的应用 微学AI 大模型的实践应用分布式人工智能大模型 大家好,我是微学AI,今天给大家介绍一下大模型的实践应用30-大模型训练和推理中分布式核心技术的应用。本文深入探讨了大模型训练和推理中分布式核心技术的应用。首先介绍了项目背景,阐述了大模型发展对高效技术的需求。接着详细讲解了分布式技术的原理,包括数据并行、模型并行等。通过实际应用实例代码,展示了分布式技术在大模型训练和推理中的具体实现。最后展望了未来发展趋势,如更高的性能、更好的兼容性等。总之,本 基于HarmonyNext的跨设备分布式数据库开发实战指南 harmonyos-next 基于HarmonyNext的跨设备分布式数据库开发实战指南引言在HarmonyNext生态系统中,跨设备分布式数据库是一个极具挑战性和创新性的领域。随着数据量的爆炸式增长和跨设备协作需求的增加,如何高效地管理和访问分布式数据成为了开发者面临的挑战。本指南将深入探讨如何利用HarmonyNext的分布式能力,结合ArkTS语言,开发一个高性能的跨设备分布式数据库。我们将通过一个实际的案例,详细讲解如 影院购票系统(二)——uni-app移动应用开发 阿常11 uni-app移动应用开发uni-appjavascript开发语言 这一篇讲解系统的逻辑代码部分,下面是ai的讲解,也可以直接跳到代码部分进行浏览。一、整体功能概述这个Vue组件构建了一个完整的影院座位选择系统,涵盖从座位数据初始化、视图渲染到交互处理以及业务逻辑的整个流程。它遵循响应式编程模式,数据的变化能够及时反映在视图上,反之亦然。二、核心数据结构剖析seatData二维数组组件利用Vue的响应式数据模型,定义了seatData这个二维数组,用来表示9x14 Python 实战 | 使用正则表达式从文本中提取指标 企研数据 Python教学python正则表达式开发语言 更多内容点击查看Python实战|使用正则表达式从文本中提取指标Python教学专栏,旨在为初学者提供系统、全面的Python编程学习体验。通过逐步讲解Python基础语言和编程逻辑,结合实操案例,让小白也能轻松搞懂Python!>>>点击此处查看往期Python教学内容本文目录一、引言二、原理概念三、实现过程四、总结本文共6471个字,阅读大约需要17分钟,欢迎指正!Part1引言正则表达式(R HarmonyNext实战:基于ArkTS的分布式任务调度系统开发 harmonyos-next HarmonyNext实战:基于ArkTS的分布式任务调度系统开发引言在HarmonyNext生态系统中,分布式任务调度是一个关键且复杂的领域。本文将深入探讨如何使用ArkTS语言开发一个高效的分布式任务调度系统,涵盖从任务分配到负载均衡的完整流程。我们将通过一个实战案例,详细讲解如何利用HarmonyNext的分布式能力,结合ArkTS的现代语法,构建一个高效、可靠的分布式任务调度系统。1.项目 HarmonyNext实战:基于ArkTS的高性能3D图形渲染引擎开发 harmonyos-next 引言在HarmonyNext生态系统中,3D图形渲染是一个极具挑战性且充满潜力的领域。本文将深入探讨如何使用ArkTS语言开发一个高性能的3D图形渲染引擎,涵盖从场景构建到渲染优化的完整流程。我们将通过一个实战案例,详细讲解如何利用HarmonyNext的图形能力,结合ArkTS的现代语法,构建一个高效、灵活的3D图形渲染引擎。项目概述1.1目标开发一个高性能的3D图形渲染引擎,支持以下功能:3D HarmonyNext实战:基于ArkTS的分布式数据同步应用开发 harmonyos-next HarmonyNext实战:基于ArkTS的分布式数据同步应用开发引言在HarmonyNext生态系统中,分布式能力是其核心特性之一。本文将深入探讨如何使用ArkTS语言开发一个高效的分布式数据同步应用,涵盖从数据存储到跨设备同步的完整流程。我们将通过一个实战案例,详细讲解如何利用HarmonyNext的分布式能力,结合ArkTS的现代语法,构建一个高效、可靠的分布式数据同步应用。1.项目概述1. 园区环境数字化管理系统(源码+文档+讲解+演示) 开源项目介绍 引言随着工业化和城市化的快速发展,园区环境管理面临着越来越多的挑战。园区环境数字化管理系统通过数字化手段,为园区管理者提供了一个高效、透明、智能的管理平台。本文将详细介绍园区环境数字化管理系统的功能、技术架构以及其在提升园区环境管理效率中的优势。系统概述园区环境数字化管理系统采用前后端分离的架构设计,服务端基于MySQL5.7+、JDK1.8+和Redis,前端则采用Vue2.6.14和Eleme 生命周期总结(uni-app、vue2、vue3生命周期讲解) 露西西★ 前端javascript前端前端框架 一、vue2生命周期Vue2的生命周期钩子函数分为4个阶段:创建、挂载、更新、销毁。1.创建阶段beforeCreate:实例初始化之后,数据观测和事件配置之前。created:实例创建完成,数据观测和事件配置已完成,但DOM未生成。2.挂载阶段beforeMount:模板编译完成,但未挂载到DOM。mounted:实例挂载到DOM后调用,DOM已生成。3.更新阶段beforeUpdate:数据更 Vue 3 实现富文本内容导出 Word 文档:前端直出方案与优化实践 茶颜悅色 前端vue.jsword 本文将深入讲解如何通过纯前端方案将富文本内容直接导出为符合中文排版规范的Word文档,对比传统服务端生成方案,本方案可降低服务器压力80%以上,同时支持即时下载功能。一、功能全景图该方案实现以下核心能力:✅纯前端Word文档生成✅中文仿宋字体完美支持✅智能分页与页边距控制✅内存安全回收机制✅浏览器全兼容方案二、技术方案对比方案响应速度服务器压力兼容性要求实现复杂度服务端生成(传统方案)慢高低高前端 C++实现简易定时器 Not_full C++自学c++ 该文章主要讲解的是使用C++来实现一个简易定时器功能。首先讲解思路:定时器最直接的就是当定时器启动后经过一定时间t后执行某个任务A。(这里可以执行完后在重置,或者直接停止。具体根据需求来实现)我们这次选择执行一次子任务即可(不停止)所以我们首要需要一个接口来添加定时器(AddTimerHandler),将定时的时间和所需要执行的任务添加进入;同样的,有添加定时器就必须要有一个停止定时器(Remov 【大数据平台】大数据平台的云迁移策略 野老杂谈 大数据平台建设指南大数据大数据平台云计算云迁移数据同步 欢迎来到我的博客,很高兴能够在这里和您见面!欢迎订阅相关专栏:⭐️全网最全IT互联网公司面试宝典:收集整理全网各大IT互联网公司技术、项目、HR面试真题.⭐️AIGC时代的创新与未来:详细讲解AIGC的概念、核心技术、应用领域等内容。⭐️大数据平台建设指南:全面讲解从数据采集到数据可视化的整个过程,掌握构建现代化数据平台的核心技术和方法。⭐️《遇见Python:初识、了解与热恋》:涵盖了Pytho 在虚拟机上安装 Hadoop 全攻略 麻芝汤圆 spark大数据分析hadoop大数据分布式windowslinux服务器 在虚拟机上安装Hadoop是进入大数据处理和分析领域的重要一步。以下将详细讲解在常见虚拟机软件(如VMwareWorkstation、VirtualBox)中,于Linux虚拟机系统安装Hadoop的流程与要点。一、前期准备虚拟机软件与系统镜像:确保已正确安装VMwareWorkstation或VirtualBox等虚拟机软件,并且拥有目标操作系统的镜像文件(如UbuntuServerISO、Ce CRON表达式详解以及示例 小猿、 服务器相关技术栈javajava服务器 概述Corn表达式(也称为Cron表达式)是用来配置定时任务的一种表达式格式,常见于Java开发中用来指定任务在特定时间执行的规则。它由6或7个空格分隔的字段组成,每个字段表示时间的不同部分。下是Corn表达式的详细讲解和示例代码:Corn表达式结构一个标准的Corn表达式由6或7个字段组成,按顺序依次表示:秒(Seconds):表示一分钟中的秒数,取值范围为0-59。分钟(Minutes):表示 Python-测试代码 Alfadi联盟 萧瑶 Pythonpython 测试是软件开发中不可或缺的环节,它能确保代码按预期运行,并在修改时快速发现潜在问题。本章将深入讲解如何为函数和类编写测试代码,涵盖单元测试、断言方法、异常处理等核心知识点,帮助开发者构建健壮可靠的程序。一、测试函数1.1单元测试和测试用例单元测试用于验证代码中最小可测试单元(如函数或方法)的行为是否符合预期。测试用例是一组测试的集合,通常对应一个文件或模块。Python的unittest模块提供了 量子位招聘 | DeepSeek帮我们改的招聘启事 量子位 关注前沿科技量子位未来同事,你好~这是一则招聘帖。如果你与我们志同道合,对AI大模型、具身智能、终端硬件、AI新媒体编辑感兴趣,我们正在招聘这些领域的原创作者。以下岗位均为全职,工作地点:北京中关村。岗位面向:社招、应届毕业生,所有岗位均可实习——表现出色均可转正加分项:乐于探索AI新工具,善用AI新工具;拥有解读论文的能力,能深入浅出讲解原理;有写代码能力;量子位长期读者。加入我们,你可以获得: 征程 6 工具链 BEVPoolV2 算子使用教程 1 - BEVPoolV2 算子详解 算法自动驾驶 1.引言当前,地平线征程6工具链已经全面支持了BEVPoolingV2算子,并与mmdetection3d的实现完成了精准对齐。然而,需要注意的是,此算子因其内在的复杂性以及相关使用示例的稀缺,致使部分用户在实际运用过程中遭遇了与预期不符的诸多问题。在这样的背景下,本文首先会对BEVPoolingV2的实现进行全方位、细致入微的剖析讲解,,让复杂的原理变得清晰易懂。随后,还会通过代表性的示例,来进 计算机专业知识【网络子网划分:最大子网个数与可分配地址计算全攻略】 一勺菠萝丶 计算机专业知识网络 一、引言在计算机网络领域,子网划分是一项重要的技术,它能帮助我们更高效地管理和利用IP地址资源。今天,我们就通过一个具体的例子,详细讲解如何计算在给定条件下的最大子网个数以及每个子网内的最大可分配地址个数。题目给出原网络掩码为/24,新子网掩码为255.255.255.248,下面我们一步步来分析。二、基础知识回顾(一)子网掩码的概念子网掩码是一个32位的二进制数,用于将IP地址划分为网络部分和主 【Vue3从零开始-第四章】5-3 传送门Teleport AI画手小王 前端javascriptcss 前菜为了很好的讲解传送门的意思,我们需要用一个常用的例子去学,那就是弹出层会用到的透明蒙版。constapp=Vue.createApp({data(){return{show:false}},methods:{handleClick(){this.show=!this.show}},template:`点击`});constvm=app.mount('#root');定义一个模板,里面有一个盒子 132java ssm springboot基于大数据的吉林省农村产权交易数据分析可视化平台系统(源码+文档+运行视频+讲解视频) QQ2279239102 springboot大数据数据分析开发语言mavenvue.js 文章目录系列文章目录目的前言一、详细视频演示二、项目部分实现截图三、技术栈后端框架springboot前端框架vue持久层框架MyBaitsPlus系统测试四、代码参考源码获取目的摘要:本文介绍了基于JavaSSM和SpringBoot开发的吉林省农村产权交易数据分析可视化平台系统,为农村产权交易市场提供决策支持。系统前端利用HTML、CSS和JavaScript构建直观的可视化界面,后端运用Ja 非常哇塞的 SpringBoot性能优化长文! 肥肥技术宅 java大数据java SpringBoot已经成为Java届的No.1框架,每天都在蹂躏着数百万的程序员们。当服务的压力上升,对SpringBoot服务的优化就会被提上议程。本文将详细讲解SpringBoot服务优化的一般思路,并附上若干篇辅助文章作为开胃菜。本文较长,最适合收藏之。1.有监控才有方向在开始对SpringBoot服务进行性能优化之前,我们需要做一些准备,把SpringBoot服务的一些数据暴露出来。比如 【0009】Python运算符详解 程序员张小厨 【007】PythonpythonPython运算符运算符Python算术运算符Python逻辑运算符Python关系运算符Python比较运算符 如果你觉得我的文章写的不错,请关注我哟,请点赞、评论,收藏此文章,谢谢!本文内容体系结构如下:运算符是用于执行各种运算的符号,例如加法、减法、乘法等。Python中的运算符可以分为算术运算符、赋值运算符、比较运算符、逻辑运算符、位运算符、成员运算符和身份运算符等。本文将详细讲解各个运算符的使用。一、算术运算符Python中的算术运算符主要用于执行数值计算,包括整数和浮点数的加减乘除等基本运算。具体 电池管理系统(BMS)架构详细解析:原理与器件选型指南 web13595609705 面试学习路线阿里巴巴架构 BMS(电池管理系统)架构详细讲解从你提供的BMS(BatteryManagementSystem)架构图来看,主要涉及到电池监控模块、通信模块、功率控制模块等部分。下面我将详细讲解该架构的各个功能模块及其工作原理。1.电池管理核心模块电池管理系统的核心部分由BQ76930芯片组成(图中的两个芯片,分别对应8节和9节电池),它负责管理和监控电池组的状态,包括电压、电流、温度等数据。BQ76930: 制服小程序的“滑手”:禁用页面左右滑动全攻略 小丁学Java 微信小程序WxMa小程序 哈哈,看来你已经很聪明地发现了小程序中左右滑动的“顽皮”行为!没错,我们可以通过设置disableScroll属性来“管教”它,同时结合CSS样式让页面既禁得住横向“乱跑”,又能顺畅地上下滚动。你的方案已经很接近完美了!下面,我会基于你提供的代码,写一篇有趣的技术博客,详细讲解如何禁用页面的左右滑动,融入你的修改建议,同时加点表情和趣味性。✦制服小程序的“滑手”:禁用页面左右滑动全攻略嘿,小程序开 Dom 周华华 JavaScripthtml <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml&q 【Spark九十六】RDD API之combineByKey bit1129 spark 1. combineByKey函数的运行机制 RDD提供了很多针对元素类型为(K,V)的API,这些API封装在PairRDDFunctions类中,通过Scala隐式转换使用。这些API实现上是借助于combineByKey实现的。combineByKey函数本身也是RDD开放给Spark开发人员使用的API之一 首先看一下combineByKey的方法说明: msyql设置密码报错:ERROR 1372 (HY000): 解决方法详解 daizj mysql设置密码 MySql给用户设置权限同时指定访问密码时,会提示如下错误: ERROR 1372 (HY000): Password hash should be a 41-digit hexadecimal number; 问题原因:你输入的密码是明文。不允许这么输入。 解决办法:用select password('你想输入的密码');查询出你的密码对应的字符串, 然后 路漫漫其修远兮 吾将上下而求索 周凡杨 学习 思索 王国维在他的《人间词话》中曾经概括了为学的三种境界古今之成大事业、大学问者,罔不经过三种之境界。“昨夜西风凋碧树。独上高楼,望尽天涯路。”此第一境界也。“衣带渐宽终不悔,为伊消得人憔悴。”此第二境界也。“众里寻他千百度,蓦然回首,那人却在灯火阑珊处。”此第三境界也。学习技术,这也是你必须经历的三种境界。第一层境界是说,学习的路是漫漫的,你必须做好充分的思想准备,如果半途而废还不如不要开始。这里,注 Hadoop(二)对话单的操作 朱辉辉33 hadoop Debug: 1、 A = LOAD '/user/hue/task.txt' USING PigStorage(' ') AS (col1,col2,col3); DUMP A; //输出结果前几行示例: (>ggsnPDPRecord(21),,) (-->recordType(0),,) (-->networkInitiation(1),,) web报表工具FineReport常用函数的用法总结(日期和时间函数) 老A不折腾 finereport报表工具web开发 web报表工具FineReport常用函数的用法总结(日期和时间函数) 说明:凡函数中以日期作为参数因子的,其中日期的形式都必须是yy/mm/dd。而且必须用英文环境下双引号(" ")引用。 DATE DATE(year,month,day):返回一个表示某一特定日期的系列数。 Year:代表年,可为一到四位数。 Month:代表月份。 c++ 宏定义中的##操作符 墙头上一根草 C++ #与##在宏定义中的--宏展开 #include <stdio.h> #define f(a,b) a##b #define g(a) #a #define h(a) g(a) int main() { &nbs 分析Spring源代码之,DI的实现 aijuans springDI现源代码 (转) 分析Spring源代码之,DI的实现 2012/1/3 by tony 接着上次的讲,以下这个sample [java] view plain copy print for循环的进化 alxw4616 JavaScript // for循环的进化 // 菜鸟 for (var i = 0; i < Things.length ; i++) { // Things[i] } // 老鸟 for (var i = 0, len = Things.length; i < len; i++) { // Things[i] } // 大师 for (var i = Things.le 网络编程Socket和ServerSocket简单的使用 百合不是茶 网络编程基础IP地址端口 网络编程;TCP/IP协议 网络:实现计算机之间的信息共享,数据资源的交换 协议:数据交换需要遵守的一种协议,按照约定的数据格式等写出去 端口:用于计算机之间的通信 每运行一个程序,系统会分配一个编号给该程序,作为和外界交换数据的唯一标识 0~65535 查看被使用的 JDK1.5 生产消费者 bijian1013 javathread生产消费者java多线程 ArrayBlockingQueue: 一个由数组支持的有界阻塞队列。此队列按 FIFO(先进先出)原则对元素进行排序。队列的头部 是在队列中存在时间最长的元素。队列的尾部 是在队列中存在时间最短的元素。新元素插入到队列的尾部,队列检索操作则是从队列头部开始获得元素。 ArrayBlockingQueue的常用方法: JAVA版身份证获取性别、出生日期及年龄 bijian1013 java性别出生日期年龄 工作中需要根据身份证获取性别、出生日期及年龄,且要还要支持15位长度的身份证号码,网上搜索了一下,经过测试好像多少存在点问题,干脆自已写一个。 CertificateNo.java package com.bijian.study; import java.util.Calendar; import 【Java范型六】范型与枚举 bit1129 java 首先,枚举类型的定义不能带有类型参数,所以,不能把枚举类型定义为范型枚举类,例如下面的枚举类定义是有编译错的 public enum EnumGenerics<T> { //编译错,提示枚举不能带有范型参数 OK, ERROR; public <T> T get(T type) { return null; 【Nginx五】Nginx常用日志格式含义 bit1129 nginx 1. log_format 1.1 log_format指令用于指定日志的格式,格式: log_format name(格式名称) type(格式样式) 1.2 如下是一个常用的Nginx日志格式: log_format main '[$time_local]|$request_time|$status|$body_bytes Lua 语言 15 分钟快速入门 ronin47 lua 基础 - - 单行注释 - - [[ [多行注释] - - ]] - - - - - - - - - - - 1. 变量 & 控制流 - - - - - - - - - - num = 23 - - 数字都是双精度 str = 'aspythonstring' java-35.求一个矩阵中最大的二维矩阵 ( 元素和最大 ) bylijinnan java the idea is from: http://blog.csdn.net/zhanxinhang/article/details/6731134 public class MaxSubMatrix { /**see http://blog.csdn.net/zhanxinhang/article/details/6731134 * Q35 求一个矩阵中最大的二维 mongoDB文档型数据库特点 开窍的石头 mongoDB文档型数据库特点 MongoDD: 文档型数据库存储的是Bson文档-->json的二进制 特点:内部是执行引擎是js解释器,把文档转成Bson结构,在查询时转换成js对象。 mongoDB传统型数据库对比 传统类型数据库:结构化数据,定好了表结构后每一个内容符合表结构的。也就是说每一行每一列的数据都是一样的 文档型数据库:不用定好数据结构, [毕业季节]欢迎广大毕业生加入JAVA程序员的行列 comsci java 一年一度的毕业季来临了。。。。。。。。 正在投简历的学弟学妹们。。。如果觉得学校推荐的单位和公司不适合自己的兴趣和专业,可以考虑来我们软件行业,做一名职业程序员。。。 软件行业的开发工具中,对初学者最友好的就是JAVA语言了,网络上不仅仅有大量的 PHP操作Excel – PHPExcel 基本用法详解 cuiyadll PHPExcel 导出excel属性设置//Include classrequire_once('Classes/PHPExcel.php');require_once('Classes/PHPExcel/Writer/Excel2007.php');$objPHPExcel = new PHPExcel();//Set properties 设置文件属性$objPHPExcel->getProperties IBM Webshpere MQ Client User Issue (MCAUSER) darrenzhu IBMjmsuserMQMCAUSER IBM MQ JMS Client去连接远端MQ Server的时候,需要提供User和Password吗? 答案是根据情况而定,取决于所定义的Channel里面的属性Message channel agent user identifier (MCAUSER)的设置。 http://stackoverflow.com/questions/20209429/how-mca-user-i 网线的接法 dcj3sjt126com 一、PC连HUB (直连线)A端:(标准568B):白橙,橙,白绿,蓝,白蓝,绿,白棕,棕。 B端:(标准568B):白橙,橙,白绿,蓝,白蓝,绿,白棕,棕。 二、PC连PC (交叉线)A端:(568A): 白绿,绿,白橙,蓝,白蓝,橙,白棕,棕; B端:(标准568B):白橙,橙,白绿,蓝,白蓝,绿,白棕,棕。 三、HUB连HUB&nb Vimium插件让键盘党像操作Vim一样操作Chrome dcj3sjt126com chromevim 什么是键盘党? 键盘党是指尽可能将所有电脑操作用键盘来完成,而不去动鼠标的人。鼠标应该说是新手们的最爱,很直观,指哪点哪,很听话!不过常常使用电脑的人,如果一直使用鼠标的话,手会发酸,因为操作鼠标的时候,手臂不是在一个自然的状态,臂肌会处于绷紧状态。而使用键盘则双手是放松状态,只有手指在动。而且尽量少的从鼠标移动到键盘来回操作,也省不少事。 在chrome里安装 vimium 插件 MongoDB查询(2)——数组查询[六] eksliang mongodbMongoDB查询数组 MongoDB查询数组 转载请出自出处:http://eksliang.iteye.com/blog/2177292 一、概述 MongoDB查询数组与查询标量值是一样的,例如,有一个水果列表,如下所示: > db.food.find() { "_id" : "001", "fruits" : [ "苹 cordova读写文件(1) gundumw100 JavaScriptCordova 使用cordova可以很方便的在手机sdcard中读写文件。 首先需要安装cordova插件:file 命令为: cordova plugin add org.apache.cordova.file 然后就可以读写文件了,这里我先是写入一个文件,具体的JS代码为: var datas=null;//datas need write var directory=& HTML5 FormData 进行文件jquery ajax 上传 到又拍云 ileson jqueryAjaxhtml5FormData html5 新东西:FormData 可以提交二进制数据。 页面test.html <!DOCTYPE> <html> <head> <title> formdata file jquery ajax upload</title> </head> <body> < swift appearanceWhenContainedIn:(version1.2 xcode6.4) 啸笑天 version swift1.2中没有oc中对应的方法: + (instancetype)appearanceWhenContainedIn:(Class <UIAppearanceContainer>)ContainerClass, ... NS_REQUIRES_NIL_TERMINATION; 解决方法: 在swift项目中新建oc类如下: #import & java实现SMTP邮件服务器 macroli java编程 电子邮件传递可以由多种协议来实现。目前,在Internet 网上最流行的三种电子邮件协议是SMTP、POP3 和 IMAP,下面分别简单介绍。 ◆ SMTP 协议 简单邮件传输协议(Simple Mail Transfer Protocol,SMTP)是一个运行在TCP/IP之上的协议,用它发送和接收电子邮件。SMTP 服务器在默认端口25上监听。SMTP客户使用一组简单的、基于文本的 mongodb group by having where 查询sql qiaolevip 每天进步一点点学习永无止境mongo纵观千象 SELECT cust_id, SUM(price) as total FROM orders WHERE status = 'A' GROUP BY cust_id HAVING total > 250 db.orders.aggregate( [ { $match: { status: 'A' } }, { $group: { Struts2 Pojo(六) Luob. POJOstrust2 注意:附件中有完整案例 1.采用POJO对象的方法进行赋值和传值 2.web配置 <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee&q struts2步骤 wuai struts 1、添加jar包 2、在web.xml中配置过滤器 <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.st 按字母分类: ABCDEFGHIJKLMNOPQRSTUVWXYZ其他