一、LiveData
LiveData是17年GoogleIO大会上提出来的一个新技术。相对于通信总线类型的框架EventBus和RxBus来说,它更简单,更简洁、更解耦。
它具有以下优点: UI和实时数据保持一致 因为LiveData采用的是观察者模式,这样一来就可以再数据发生改变时获得通知,更新UI
避免内存泄漏 观察者被绑定到组件的生命周期上,当被绑定的组件销毁(Destory)时,观察者会立刻自动清理自身的数据。
不会再产生由于Activity处于stop状态而引起的崩溃 当Activity处于后台状态时,是不会收到LiveData的任何事件的
不需要再解决生命周期带来的问题 LiveData可以感知被绑定的组件的生命周期,只有在活跃状态才会通知数据变化
实时数据刷新 当组件处于活跃状态或者从不活跃状态到活跃状态时总是能收到最新的数据
解决Confinguration Change问题 在屏幕发生旋转或者被回收再次启动,立刻就能收到最新的数据
二、简要分析运用方式:
当 LiveData 所持有的数据改变时,它会通知相应的界面代码进行更新。 同时,LiveData 持有界面代码 Lifecycle (生命周期组件)的引用,这意味着它会在界面代码(LifecycleOwner)的生命周期处于 started 或 resumed 时作出相应更新,而在 LifecycleOwner 被销毁时停止更新。 另外ViewModel的优点也很明显,为Activity 、Fragment存储数据,直到完全销毁。尤其是屏幕旋转的场景,常用的方法都是通过onSaveInstanceState()保存数据,再在onCreate()中恢复。
既然LiveData 在线程中传递事件这么优秀,那么我们应用到项目总的话,就可以集成到一块。这样就诞生了LiveDataBus。
三、LiveDataBus优点:
LiveDataBus的实现及其简单 相对EventBus复杂的实现,LiveDataBus只需要一个类就可以实现
LiveDataBus可以减小APK包的大小 LiveDataBus只依赖Android官方组件LiveData,本身实现只一个类。EventBus 57Kb、RxJava 2.2M
LiveDataBus 依赖方支持更好 LiveDataBus只依赖Android官方组件LiveData,相比RxBus依赖的RxJava和RxAndroid,依赖方支持更好
LiveDataBus具有生命周期感知 LiveDataBus具有生命周期感知,在Android系统中使用调用者不需要调用反注册,相比EventBus和RxBus使用更为方便,并且没有内存泄漏风险。
四、代码展示:
以上我们已经知道了,LiveData订阅消息和发送消息的方式。 那么应用到项目中时,使用Map将这些LiveData保存记录下来,这样各个页面的调用存取都可以写到同一个Map中,就形成总线机制。
订阅消息 1、observe 生命周期感知,不需要手动取消订阅
LiveDataBus.get().with("key_name", String.class)
.observe(this, new Observer() {
@Override
public void onChanged(@Nullable String s) {
}
});
2、observeForever 需要手动取消订阅
LiveDataBus.get().with("key_name", String.class).observeForever(observer);
LiveDataBus.get().with("key_name", String.class).removeObserver(observer);
发送消息 1、setValue 在主线程发送消息
LiveDataBus.get().with("key_name").setValue(value);
2、postValue 在后台线程发送消息,订阅者会在主线程收到消息
LiveDataBus.get().with("key_name").postValue(value);
Sticky模式 支持在注册订阅者的时候设置Sticky模式,这样订阅者可以接收到订阅之前发送的消息
observeSticky 生命周期感知,不需要手动取消订阅,Sticky模式
LiveDataBus.get()
.with("sticky_key", String.class)
.observeSticky(this, new Observer() {
@Override
public void onChanged(@Nullable String s) {
}
});
observeStickyForever 需要手动取消订阅,Sticky模式
LiveDataBus.get().with("sticky_key", String.class).observeStickyForever(observer);
LiveDataBus.get().with("sticky_key", String.class).removeObserver(observer);
public final class LiveDataBus {
private final Map> bus;
private LiveDataBus() {
bus = new HashMap<>();
}
private static class SingletonHolder {
private static final LiveDataBus DEFAULT_BUS = new LiveDataBus();
}
public static LiveDataBus get() {
return SingletonHolder.DEFAULT_BUS;
}
public synchronized BusMutableLiveData with(String key, Class type) {
if (!bus.containsKey(key)) {
bus.put(key, new BusMutableLiveData<>());
}
return (BusMutableLiveData) bus.get(key);
}
public BusMutableLiveData with(String key) {
return with(key, Object.class);
}
private static class ObserverWrapper implements Observer {
private Observer observer;
public ObserverWrapper(Observer observer) {
this.observer = observer;
}
@Override
public void onChanged(@Nullable T t) {
if (observer != null) {
if (isCallOnObserve()) {
return;
}
observer.onChanged(t);
}
}
private boolean isCallOnObserve() {
StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
if (stackTrace != null && stackTrace.length > 0) {
for (StackTraceElement element : stackTrace) {
if ("android.arch.lifecycle.LiveData".equals(element.getClassName()) &&
"observeForever".equals(element.getMethodName())) {
return true;
}
}
}
return false;
}
}
public static class BusMutableLiveData extends MutableLiveData {
private class PostValueTask implements Runnable {
private Object newValue;
public PostValueTask(@NonNull Object newValue) {
this.newValue = newValue;
}
@Override
public void run() {
setValue((T) newValue);
}
}
private Map observerMap = new HashMap<>();
private Handler mainHandler = new Handler(Looper.getMainLooper());
@Override
public void postValue(T value) {
mainHandler.post(new PostValueTask(value));
}
@Override
public void observe(@NonNull LifecycleOwner owner, @NonNull Observer observer) {
super.observe(owner, observer);
try {
hook(observer);
} catch (Exception e) {
e.printStackTrace();
}
}
public void observeSticky(@NonNull LifecycleOwner owner, @NonNull Observer observer) {
super.observe(owner, observer);
}
@Override
public void observeForever(@NonNull Observer observer) {
if (!observerMap.containsKey(observer)) {
observerMap.put(observer, new ObserverWrapper(observer));
}
super.observeForever(observerMap.get(observer));
}
public void observeStickyForever(@NonNull Observer observer) {
super.observeForever(observer);
}
@Override
public void removeObserver(@NonNull Observer observer) {
Observer realObserver = null;
if (observerMap.containsKey(observer)) {
realObserver = observerMap.remove(observer);
} else {
realObserver = observer;
}
super.removeObserver(realObserver);
}
private void hook(@NonNull Observer observer) throws Exception {
//get wrapper's version
Class classLiveData = LiveData.class;
Field fieldObservers = classLiveData.getDeclaredField("mObservers");
fieldObservers.setAccessible(true);
Object objectObservers = fieldObservers.get(this);
Class classObservers = objectObservers.getClass();
Method methodGet = classObservers.getDeclaredMethod("get", Object.class);
methodGet.setAccessible(true);
Object objectWrapperEntry = methodGet.invoke(objectObservers, observer);
Object objectWrapper = null;
if (objectWrapperEntry instanceof Map.Entry) {
objectWrapper = ((Map.Entry) objectWrapperEntry).getValue();
}
if (objectWrapper == null) {
throw new NullPointerException("Wrapper can not be bull!");
}
Class classObserverWrapper = objectWrapper.getClass().getSuperclass();
Field fieldLastVersion = classObserverWrapper.getDeclaredField("mLastVersion");
fieldLastVersion.setAccessible(true);
//get livedata's version
Field fieldVersion = classLiveData.getDeclaredField("mVersion");
fieldVersion.setAccessible(true);
Object objectVersion = fieldVersion.get(this);
//set wrapper's version
fieldLastVersion.set(objectWrapper, objectVersion);
}
}
}
注: 在BusMutableLiveData类中,hook函数利用反射机制重新给wrapper的version赋值了。跟踪源码可知:这么操作的意义是为了在Activity未创建时,不接收发布消息者发布过来的消息。(例:网络请求后使用LiveData向AActivity发送消息,但是AActivity还未创建,这样一旦AActivity创建后onResume函数调用,View会跟着数据变化。但如果我不想AActivity创建后View有所改变呢,就使用调用hook函数的observe去订阅就可以了)
你可能感兴趣的:(组件间通信方案(六):自动感知生命周期事件总线LiveDataBus)
wav2lip部署方案-数字人项目
何为标准
python
该项目商用需要通过原作者原作者github链接说明该项目可以将语音和视频或图片结合生成数字人。大家多关注,后续会把llm、RAG、AGENT、TTS、ASR等结合起来,形成一套完整的系统显卡硬件资源显卡:2080ti开始部署下载源码gitclonehttps://github.com/Rudrabha/Wav2Lipcd/root/Wav2Lippipinstall-rrequirements.t
SenseVoice 实测,阿里开源语音大模型,识别效果和效率优于 Whisper,居然还能检测掌声、笑声!5分钟带你部署体验
AI码上来
AI实战 开源 whisper xcode
前段时间,带着大家捏了一个对话机器人:手把手带你搭建一个语音对话机器人,5分钟定制个人AI小助手(新手入门篇)其中语音识别(ASR)方案,采用的是阿里开源的FunASR,这刚不久,阿里又开源了一个更强的音频基础模型,该模型具有如下能力:语音识别(ASR)语种识别(LID)语音情感识别(SER)声学事件分类(AEC)声学事件检测(AED)传送门:https://github.com/FunAudio
什么是BIO、NIO、AIO?
PLuto777_
nio java aio
在高性能的IO体系设计中,BIO、NIO、AIO的概念,常常会让我们感到困惑不解。在Java面试中,我们也经常会被问到这个问题。譬如:BIO、NIO、AIO的概念同步/异步、阻塞/非阻塞的区别NIO如何实现多路复用功能BIOBIO全称是BlockingIO,是JDK1.4之前的传统IO模型,本身是同步阻塞模式。线程发起IO请求后,一直阻塞IO,直到缓冲区数据就绪后,再进入下一步操作。针对网络通信都
Vue中事件名的命名规范
sakuraxiaoyu
vue.js 前端 javascript
Vue中事件名的命名规范起因:本人之前不太写vue的项目,最近接触了vue的代码,在学习的过程中同时也会伴随着一点疑惑。比如一以下面的父子组件的事件传递为例:父组件:显然,父组件有个自定义事件refresh-list需要子组件进行接收。子组件:...constemit=defineEmits(["refreshList"]);...//触发事件emit("refreshList");我疑惑的点在于
DeepSeek 助力 Vue 开发:打造丝滑的表单验证(Form Validation)
宝码香车
# DeepSeek vue.js 前端 javascript ecmascript DeepSeek
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦目录DeepSeek助力Vue开发:打造丝滑的表单验证(FormValidation)前言页面效果指令输入组件属性定义1.表单数据绑定相关2.验证规则相关3.样式和布局相关4.其他组件事件定义1.验证相关2.表单提交相关3.字段值变化相关其他可能
️ 总览:TotalSegmentator - 医学影像分割的革新者
金斐茉
️总览:TotalSegmentator-医学影像分割的革新者TotalSegmentatorToolforrobustsegmentationof>100importantanatomicalstructuresinCTimages项目地址:https://gitcode.com/gh_mirrors/to/TotalSegmentator在医学图像处理领域中,精确且高效的自动分割工具对于研究和
探索TotalSegmentator:一款强大的全场景图像分割工具
计蕴斯Lowell
探索TotalSegmentator:一款强大的全场景图像分割工具项目地址:https://gitcode.com/gh_mirrors/to/TotalSegmentator项目简介是一个开源的、基于深度学习的全场景图像分割框架。它由开发者Wasserth创建,旨在为医学影像分析、自动驾驶、遥感图像处理等多个领域提供高效且准确的像素级分类能力。该项目的亮点在于其模型的通用性和易用性,能够处理多种
Dtcms修改PC站分享到手机端后访问打开手机版的当前页面
一包烟电脑面前做一天
web dtcms
dtcms框架中自带的功能是在手机端访问域名,自动跳转到手机版的首页。所以分享后自动跳转手机版当前页面需要自己调整,代码如下:在main目录下的common.js中修改JS判断即可:if(getCookie('m2wcookie')!='1'&&browserRedirect()){//PC跳转移动端varhostname=window.location.hostname;varpathname=
鸿蒙5.0实战案例:关于图像撕裂、掉帧等异常现象的原理以及优化方案
敢嗣先锋
鸿蒙开发 HarmonyOS 移动开发 harmonyos 鸿蒙开发 openharmony 移动开发 ArkUI 性能优化
往期推文全新看点(文中附带全新鸿蒙5.0全栈学习笔录)✏️鸿蒙(HarmonyOS)北向开发知识点记录~✏️鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~✏️鸿蒙应用开发与鸿蒙系统开发哪个更有前景?✏️嵌入式开发适不适合做鸿蒙南向开发?看完这篇你就了解了~✏️对于大前端开发来说,转鸿蒙开发究竟是福还是祸?✏️鸿蒙岗位需求突增!移动端、PC端、IoT到底该怎么选?✏️记录一场鸿蒙开发岗位面
EBS 性能不足?从吞吐量到 IOPS,阿里云全方位优化
Anna_Tong
阿里云 云计算 存储加速 吞吐量优化 RAID配置 云计算运维 IOPS 提升
在云计算环境中,存储性能对于业务稳定运行至关重要,尤其是数据库、大数据分析、AI计算等高IO需求的应用。然而,许多用户在使用EBS(弹性块存储)时,可能会遇到磁盘吞吐量或IOPS(每秒输入/输出操作数)不足的问题,导致应用响应变慢、数据处理延迟,甚至影响业务连续性。那么,是什么原因导致EBS性能瓶颈?如何优化吞吐量和IOPS以提升存储性能?阿里云又能提供哪些优化方案?本文将从存储架构、性能监控、优
Kubernetes & 容器自动伸缩失败:解决方案及阿里云如何帮助
Anna_Tong
kubernetes 阿里云 容器 负载均衡 云原生 弹性计算 自动伸缩
随着容器技术的普及,Kubernetes(K8s)已成为构建现代云原生应用的核心平台。自动伸缩(AutoScaling)功能可以帮助应用在流量波动时动态调整资源,提高效率并节约成本。然而,很多企业在配置水平自动伸缩(HorizontalPodAutoscaler,HPA)或ECS扩容策略时,常常遇到配置错误或无法触发扩容的问题,导致资源无法及时扩展或收缩,影响系统的稳定性和用户体验。本文将为您分享
DeepSeek接入大数据能做什么
PersistDZ
大数据与AI 大数据
DeepSeek作为一家专注于AGI和AI大模型技术的公司,在大数据领域可以通过以下方式切入,结合其核心能力提供创新解决方案:一、DeepSeek接入大数据领域的技术路径多模态数据处理能力支持文本/图像/视频/传感器数据的统一处理自主研发的MoE(MixtureofExperts)架构可并行处理异构数据超大规模特征工程基于千亿参数模型的自动特征提取支持非结构化数据的深度语义解析实时计算优化自研分布
GPU通信革命:跨平面网络效率提升300%的秘密武器
CodePatentMaster
人工智能 深度学习 机器学习 自然语言处理 微服务 服务器 AIGC
「无需CPU中转,多平面网络RDMA通信时延降低50%」——Deepseek专利CN118612157A一、技术解析:突破AI算力瓶颈的底层创新1.技术背景:终结多平面网络CPU中转困境传统多平面网络中,跨平面GPU通信必须经过CPU内存拷贝,导致两大痛点:20-30%的通信带宽浪费在CPU中转环节大规模集群训练时,网络拥塞引发训练任务停滞该专利通过构建GPU直连通道,实现跨平面网络的零拷贝通信,
Web开发中的可专利性分析:透过一个案例学习
CodePatentMaster
前端 学习
Web开发工程师在创新过程中经常面临是否能申请专利并获得专利权的问题。本文通过一个详细的Web开发领域案例来阐释可专利性的分析过程。案例分析假设您是一名Web开发工程师,您开发了一种名为“动态响应式前端框架”(DynamicResponsiveFrontendFramework,DRFF)的新型前端框架。与传统前端框架相比,DRFF通过引入一种基于AI的组件化设计方法和实时数据流处理机制,显著提高
[从零开始的 Vue3 系列]:第四章——Vue3 中常用组件通信全解析
花信少年plus
从零开始的vue3 系列 vue.js javascript 前端
前言本系列将从零开始,系统性地介绍Vue3的常用API,逐步深入每个核心概念与功能模块。通过详尽的讲解与实战演示,帮助大家掌握Vue3的基础与进阶知识,最终具备独立搭建完整Vue3项目的能力。vue3中的组件通信Vue3提供了多种方式来进行组件之间的通信。根据场景的不同,开发者可以选择最合适的方式进行数据的传递与事件的处理。1.通过Props传递数据(父->子)父组件:importChildCom
网络安全——Span 安全监控
Hacker_LaoYi
web安全 php 安全
SPAN释义:SPAN技术我们可以把交换机上某些想要被监控端口(以下简称受控端口)的数据流COPY或MIRROR一份,发送给连接在监控端口上的流量分析仪,比如CISCO的IDS或是装SNIFFE工具的PC受控端口和监控端口可以在同一台交换机上的,那就是本地SPAN。背景环境:防火墙,这是大家提到安全时候想到的第一个词,最为可靠的设备要数防火墙了,通过我们的精心配制安全方案,他确实能给我们带来不错的
从零到入门:人工智能学习路径全解析
这题有点难度
人工智能 学习
一、打破迷雾:重新认识人工智能人工智能(AI)早已不再是科幻电影中的专属概念,而是渗透到我们生活的方方面面。从手机里的语音助手到电商平台的推荐系统,从自动驾驶到医疗影像分析,AI技术正在重塑人类社会的运行方式。对于初学者而言,建立正确的认知框架至关重要:1.技术图谱解析:机器学习(ML):AI的核心驱动力,使计算机具备从数据中学习的能力深度学习(DL):基于神经网络的进阶技术,擅长处理图像、语音等
Django 5实用指南(二)项目结构与管理
网络风云
python django 后端
2.1Django5项目结构概述当你创建一个新的Django项目时,Django会自动生成一个默认的项目结构。这个结构是根据Django的最佳实践来设计的,以便开发者能够清晰地管理和维护项目中的各种组件。理解并管理好这些文件和目录结构是Django开发的基础。假设你使用django-adminstartprojectmyproject命令创建了一个新项目,下面是一个典型的Django5项目的文件结
Spring Boot 中自动装配机制的原理
李恩11
java spring boot 开发语言
SpringBoot的自动装配机制是其核心特性之一,它简化了Spring应用的配置,让开发者能够快速构建应用。以下是对其原理的详细总结:1.核心概念自动装配(Auto-configuration):SpringBoot根据应用依赖和配置,自动配置SpringBean的过程。条件化配置(ConditionalConfiguration):根据特定条件决定是否启用某个配置类或Bean。SpringBo
JAX-WS与JAX-RS比较分析及与SpringMVC集成实现
零度anngle
SpringMVC Restful spring mvc JAX-RS JAX-WS
1、导言过去几年,REST逐渐成为影响Web框架、Web协议与Web应用设计的重要概念。如果你还不了解REST,那这个简短的介绍将有助你快速掌握REST,此外还可以点击这里了解关于REST的更多信息。现在有越来越多的公司希望能以简单而又贴合Web架构本身的方式公开WebAPI,因此REST变得越来越重要也就不足为奇了。使用Ajax进行通信的富浏览器端也在朝这个目标不断迈进。这个架构原则提升了万维网
今日-Vue框架
幼儿园口算大王
vue.js 前端 javascript java
什么是VUE框架?Vue是一款用于构建用户界面的JavaScript框架。它基于标准HTML、CSS和JavaScript构建,并提供了一套声明式的、组件化的编程模型,帮助你高效地开发用户界面。Vue的核心是一个响应的数据绑定系统,它让数据与DOM保持同步非常简单。Vue的目标是通过尽可能简单的API实现响应的数据绑定和组合的视图组件。它不仅易于上手,还便于与第三方库或既有项目整合。Vue也被称为
C++中的线程同步方式
凌云行者
C++ c++ 线程同步 互斥锁 条件变量 信号量 屏障 原子类型
线程同步方式互斥锁概述:用于保护临界区,确保同一时间只有一个线程可以访问共享资源。常见的互斥锁有std::mutex,std::lock_guard和std::unique_lockmutex概述:用于管理多个线程对共享资源的互斥访问,防止数据竞争和并发问题基础用法示例:#include#include#includeintcnt=0;//共享变量资源std::mutexmtx;//共享变量的互斥
探索并应用Copilot背后的技术:自主代理架构
花生糖@
AIGC学习资料库 copilot AIGC 人工智能
引言Copilot技术,作为现代软件开发中的一个创新工具,正在改变编程的协作方式。它通过集成到开发环境中,为开发者提供实时的代码建议和自动化的代码补全功能。本篇文章将深入探讨Copilot背后的技术——自主代理架构,并探讨其在软件开发中的应用潜力。Copilot技术概述Copilot是由GitHub和OpenAI合作开发的一项技术,它利用机器学习模型来理解代码上下文,并提供智能的代码补全建议。这项
Scrapy分布式爬虫系统
ivwdcwso
开发 运维 scrapy 分布式 爬虫 python 开发
一、概述在这篇博文中,我们将介绍如何使用Docker来部署Scrapy分布式爬虫系统,包括Scrapyd、Logparser和Scrapyweb三个核心组件。这种部署方式适用于Scrapy项目和Scrapy-Redis分布式爬虫项目。需要安装的组件:Scrapyd-服务端,用于运行打包后的爬虫代码,所有爬虫机器都需要安装。Logparser-服务端,用于解析爬虫日志,配合Scrapyweb进行实时
使用 Docker 部署 Apache Spark 集群教程
努力的小T
docker docker spark linux 运维 服务器 云计算 容器
简介ApacheSpark是一个强大的统一分析引擎,用于大规模数据处理。本文将详细介绍如何使用Docker和DockerCompose快速部署一个包含一个Master节点和两个Worker节点的Spark集群。这种方法不仅简化了集群的搭建过程,还提供了资源隔离、易于扩展等优势。前置条件在开始之前,请确保你的环境中已经准备好了以下组件:安装并运行DockerEngine。安装DockerCompos
std::unique_lock<std::mutex> lock(_mutexSwathDone);
Ring__Rain
c++
std::unique_locklock(_mutexSwathDone);是C++中用于管理互斥锁(mutex)的常见用法。以下是详细解析:1.代码作用std::mutex:这是C++标准库中的互斥锁类,用于保护共享资源,防止多线程同时访问导致数据竞争。std::unique_lock:这是一个RAII(资源获取即初始化)风格的锁管理类,用于自动管理互斥锁的加锁和解锁。这行代码的作用是:在构造l
python获取抖音直播间用户/弹幕/评论/礼物信息(6月份sign最新版)
阿福不是狗
Python使用总结 python 网络爬虫
python获取抖音直播间用户/弹幕/评论/礼物信息(6月份sign最新版)这是一个用Python编写的抖音直播间信息获取工具。该服务的主要功能是获取抖音直播间的实时信息,包括:直播间进场用户:服务能够实时获取进入直播间的用户信息,包括用户ID、用户名等。弹幕信息:服务能够实时接收并解析直播间内的弹幕信息,让用户能够及时了解观众的实时反馈。礼物信息:服务能够实时获取观众送出的礼物信息,包括礼物名称
量子计算威胁下Java应用的安全防护:技术剖析与实践
老猿讲编程
量子计算 java 安全
在科技飞速发展的当下,众多公司与研究团队全力投入实现量子霸权的研究,使得量子计算机超越传统计算机运算效率的未来愈发临近。量子计算虽蕴含着巨大的潜力,但也给现有加密体系带来了严峻挑战。一旦量子计算机具备破解当前加密算法的能力,大量基于现有加密技术保护的数据和通信都将面临风险,“先窃取,后解密”的攻击策略可能成为现实。在此背景下,Java应用如何构建有效的防御机制,抵御量子攻击,成为了亟待解决的关键问
Intel i7系列CPU替换为Xeon X79或X99架构的CPU替代方案和对比分析
gzgenius
CPU 个人PC采购 XEON 电脑
Inteli7系列CPU替换为XeonX79或X99架构的CPU,需要从性能、功耗、兼容性、价格和应用场景等多方面进行分析。以下是针对不同用户群体的替代方案和对比分析:1.XeonX79和X99架构简介XeonX79:基于IntelSandyBridge架构,支持三路或四路处理器扩展,适合高端服务器和工作站。XeonX99:基于IntelBroadwell架构,支持双路扩展,适合高性能计算和虚拟化
如何让C++程序自动生成dump文件?以及如何分析dump文件?
dvlinker
C/C++实战专栏 C/C++软件开发从入门到实战 c++ 生成dump文件 windbg 分析dump文件
目录1、API函数SetUnhandledExceptionFilter介绍2、调用SetUnhandledExceptionFilter设置异常处理函数3、调用MiniDumpWriteDump函数导出包含异常上下文的dump文件4、dump文件的多种生成方式5、使用Windbg分析dump文件6、最后C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)https:/
数据采集高并发的架构应用
3golden
.net
问题的出发点:
最近公司为了发展需要,要扩大对用户的信息采集,每个用户的采集量估计约2W。如果用户量增加的话,将会大量照成采集量成3W倍的增长,但是又要满足日常业务需要,特别是指令要及时得到响应的频率次数远大于预期。
&n
不停止 MySQL 服务增加从库的两种方式
brotherlamp
linux linux视频 linux资料 linux教程 linux自学
现在生产环境MySQL数据库是一主一从,由于业务量访问不断增大,故再增加一台从库。前提是不能影响线上业务使用,也就是说不能重启MySQL服务,为了避免出现其他情况,选择在网站访问量低峰期时间段操作。
一般在线增加从库有两种方式,一种是通过mysqldump备份主库,恢复到从库,mysqldump是逻辑备份,数据量大时,备份速度会很慢,锁表的时间也会很长。另一种是通过xtrabacku
Quartz——SimpleTrigger触发器
eksliang
SimpleTrigger TriggerUtils quartz
转载请出自出处:http://eksliang.iteye.com/blog/2208166 一.概述
SimpleTrigger触发器,当且仅需触发一次或者以固定时间间隔周期触发执行;
二.SimpleTrigger的构造函数
SimpleTrigger(String name, String group):通过该构造函数指定Trigger所属组和名称;
Simpl
Informatica应用(1)
18289753290
sql workflow lookup 组件 Informatica
1.如果要在workflow中调用shell脚本有一个command组件,在里面设置shell的路径;调度wf可以右键出现schedule,现在用的是HP的tidal调度wf的执行。
2.designer里面的router类似于SSIS中的broadcast(多播组件);Reset_Workflow_Var:参数重置 (比如说我这个参数初始是1在workflow跑得过程中变成了3我要在结束时还要
python 获取图片验证码中文字
酷的飞上天空
python
根据现成的开源项目 http://code.google.com/p/pytesser/改写
在window上用easy_install安装不上 看了下源码发现代码很少 于是就想自己改写一下
添加支持网络图片的直接解析
#coding:utf-8
#import sys
#reload(sys)
#sys.s
AJAX
永夜-极光
Ajax
1.AJAX功能:动态更新页面,减少流量消耗,减轻服务器负担
2.代码结构:
<html>
<head>
<script type="text/javascript">
function loadXMLDoc()
{
.... AJAX script goes here ...
创业OR读研
随便小屋
创业
现在研一,有种想创业的想法,不知道该不该去实施。因为对于的我情况这两者是矛盾的,可能就是鱼与熊掌不能兼得。
研一的生活刚刚过去两个月,我们学校主要的是
需求做得好与坏直接关系着程序员生活质量
aijuans
IT 生活
这个故事还得从去年换工作的事情说起,由于自己不太喜欢第一家公司的环境我选择了换一份工作。去年九月份我入职现在的这家公司,专门从事金融业内软件的开发。十一月份我们整个项目组前往北京做现场开发,从此苦逼的日子开始了。
系统背景:五月份就有同事前往甲方了解需求一直到6月份,后续几个月也完
如何定义和区分高级软件开发工程师
aoyouzi
在软件开发领域,高级开发工程师通常是指那些编写代码超过 3 年的人。这些人可能会被放到领导的位置,但经常会产生非常糟糕的结果。Matt Briggs 是一名高级开发工程师兼 Scrum 管理员。他认为,单纯使用年限来划分开发人员存在问题,两个同样具有 10 年开发经验的开发人员可能大不相同。近日,他发表了一篇博文,根据开发者所能发挥的作用划分软件开发工程师的成长阶段。
初
Servlet的请求与响应
百合不是茶
servlet get提交 java处理post提交
Servlet是tomcat中的一个重要组成,也是负责客户端和服务端的中介
1,Http的请求方式(get ,post);
客户端的请求一般都会都是Servlet来接受的,在接收之前怎么来确定是那种方式提交的,以及如何反馈,Servlet中有相应的方法, http的get方式 servlet就是都doGet(
web.xml配置详解之listener
bijian1013
java web.xml listener
一.定义
<listener>
<listen-class>com.myapp.MyListener</listen-class>
</listener>
二.作用 该元素用来注册一个监听器类。可以收到事件什么时候发生以及用什么作为响
Web页面性能优化(yahoo技术)
Bill_chen
JavaScript Ajax Web css Yahoo
1.尽可能的减少HTTP请求数 content
2.使用CDN server
3.添加Expires头(或者 Cache-control) server
4.Gzip 组件 server
5.把CSS样式放在页面的上方。 css
6.将脚本放在底部(包括内联的) javascript
7.避免在CSS中使用Expressions css
8.将javascript和css独立成外部文
【MongoDB学习笔记八】MongoDB游标、分页查询、查询结果排序
bit1129
mongodb
游标
游标,简单的说就是一个查询结果的指针。游标作为数据库的一个对象,使用它是包括
声明
打开
循环抓去一定数目的文档直到结果集中的所有文档已经抓取完
关闭游标
游标的基本用法,类似于JDBC的ResultSet(hasNext判断是否抓去完,next移动游标到下一条文档),在获取一个文档集时,可以提供一个类似JDBC的FetchSize
ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务 的解决方法
白糖_
ORA-12514
今天通过Oracle SQL*Plus连接远端服务器的时候提示“监听程序当前无法识别连接描述符中请求服务”,遂在网上找到了解决方案:
①打开Oracle服务器安装目录\NETWORK\ADMIN\listener.ora文件,你会看到如下信息:
# listener.ora Network Configuration File: D:\database\Oracle\net
Eclipse 问题 A resource exists with a different case
bozch
eclipse
在使用Eclipse进行开发的时候,出现了如下的问题:
Description Resource Path Location TypeThe project was not built due to "A resource exists with a different case: '/SeenTaoImp_zhV2/bin/seentao'.&
编程之美-小飞的电梯调度算法
bylijinnan
编程之美
public class AptElevator {
/**
* 编程之美 小飞 电梯调度算法
* 在繁忙的时间,每次电梯从一层往上走时,我们只允许电梯停在其中的某一层。
* 所有乘客都从一楼上电梯,到达某层楼后,电梯听下来,所有乘客再从这里爬楼梯到自己的目的层。
* 在一楼时,每个乘客选择自己的目的层,电梯则自动计算出应停的楼层。
* 问:电梯停在哪
SQL注入相关概念
chenbowen00
sql Web 安全
SQL Injection:就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。
首先让我们了解什么时候可能发生SQ
[光与电]光子信号战防御原理
comsci
原理
无论是在战场上,还是在后方,敌人都有可能用光子信号对人体进行控制和攻击,那么采取什么样的防御方法,最简单,最有效呢?
我们这里有几个山寨的办法,可能有些作用,大家如果有兴趣可以去实验一下
根据光
oracle 11g新特性:Pending Statistics
daizj
oracle dbms_stats
oracle 11g新特性:Pending Statistics 转
从11g开始,表与索引的统计信息收集完毕后,可以选择收集的统信息立即发布,也可以选择使新收集的统计信息处于pending状态,待确定处于pending状态的统计信息是安全的,再使处于pending状态的统计信息发布,这样就会避免一些因为收集统计信息立即发布而导致SQL执行计划走错的灾难。
在 11g 之前的版本中,D
快速理解RequireJs
dengkane
jquery requirejs
RequireJs已经流行很久了,我们在项目中也打算使用它。它提供了以下功能:
声明不同js文件之间的依赖
可以按需、并行、延时载入js库
可以让我们的代码以模块化的方式组织
初看起来并不复杂。 在html中引入requirejs
在HTML中,添加这样的 <script> 标签:
<script src="/path/to
C语言学习四流程控制if条件选择、for循环和强制类型转换
dcj3sjt126com
c
# include <stdio.h>
int main(void)
{
int i, j;
scanf("%d %d", &i, &j);
if (i > j)
printf("i大于j\n");
else
printf("i小于j\n");
retu
dictionary的使用要注意
dcj3sjt126com
IO
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
user.user_id , @"id",
user.username , @"username",
Android 中的资源访问(Resource)
finally_m
xml android String drawable color
简单的说,Android中的资源是指非代码部分。例如,在我们的Android程序中要使用一些图片来设置界面,要使用一些音频文件来设置铃声,要使用一些动画来显示特效,要使用一些字符串来显示提示信息。那么,这些图片、音频、动画和字符串等叫做Android中的资源文件。
在Eclipse创建的工程中,我们可以看到res和assets两个文件夹,是用来保存资源文件的,在assets中保存的一般是原生
Spring使用Cache、整合Ehcache
234390216
spring cache ehcache @Cacheable
Spring使用Cache
从3.1开始,Spring引入了对Cache的支持。其使用方法和原理都类似于Spring对事务管理的支持。Spring Cache是作用在方法上的,其核心思想是这样的:当我们在调用一个缓存方法时会把该方法参数和返回结果作为一个键值对存放在缓存中,等到下次利用同样的
当druid遇上oracle blob(clob)
jackyrong
oracle
http://blog.csdn.net/renfufei/article/details/44887371
众所周知,Oracle有很多坑, 所以才有了去IOE。
在使用Druid做数据库连接池后,其实偶尔也会碰到小坑,这就是使用开源项目所必须去填平的。【如果使用不开源的产品,那就不是坑,而是陷阱了,你都不知道怎么去填坑】
用Druid连接池,通过JDBC往Oracle数据库的
easyui datagrid pagination获得分页页码、总页数等信息
ldzyz007
var grid = $('#datagrid');
var options = grid.datagrid('getPager').data("pagination").options;
var curr = options.pageNumber;
var total = options.total;
var max =
浅析awk里的数组
nigelzeng
二维数组 array 数组 awk
awk绝对是文本处理中的神器,它本身也是一门编程语言,还有许多功能本人没有使用到。这篇文章就单单针对awk里的数组来进行讨论,如何利用数组来帮助完成文本分析。
有这么一组数据:
abcd,91#31#2012-12-31 11:24:00
case_a,136#19#2012-12-31 11:24:00
case_a,136#23#2012-12-31 1
搭建 CentOS 6 服务器(6) - TigerVNC
rensanning
centos
安装GNOME桌面环境
# yum groupinstall "X Window System" "Desktop"
安装TigerVNC
# yum -y install tigervnc-server tigervnc
启动VNC服务
# /etc/init.d/vncserver restart
# vncser
Spring 数据库连接整理
tomcat_oracle
spring bean jdbc
1、数据库连接jdbc.properties配置详解 jdbc.url=jdbc:hsqldb:hsql://localhost/xdb jdbc.username=sa jdbc.password= jdbc.driver=不同的数据库厂商驱动,此处不一一列举 接下来,详细配置代码如下:
Spring连接池
Dom4J解析使用xpath java.lang.NoClassDefFoundError: org/jaxen/JaxenException异常
xp9802
用Dom4J解析xml,以前没注意,今天使用dom4j包解析xml时在xpath使用处报错
异常栈:java.lang.NoClassDefFoundError: org/jaxen/JaxenException异常
导入包 jaxen-1.1-beta-6.jar 解决;
&nb