// ////////////////////////////////////////////////////////////////////////// // 这是一个多线程访问全局变量导致崩溃的例子...= g_VecInt.end(); it++ ) { // 故意将读取时间设置长,这样更大概率导致崩溃 Sleep(10); printf("%d %d\...,导致崩溃的问题。...在dump.exe按任意键,重现崩溃路径 崩溃发生,windbg发现异常并中断 ?...这个流程非常适合于分析的场景是: 没有做通过异常方式做保护的程序(否则windbg挂载后会一直陷入中断,非常烦人。
View订阅LiveData中的变化,并对其做出反应。这对于在屏幕上连续显示并可能会修改的数据来说是非常有效的手段。...另外,从不同的线程设置值可能会导致竞赛条件,只产生一个对观察者的调用。 但前面这种解决方法的主要问题是,它很难理解,而且很难看,同时,我们如何确保在导航事件发生后值能被正确的重置?...在LiveData观测器中使用你自己的EventWrapper,并根据你的需要对其进行定制。 另外,如果你有大量的事件,可以使用这个EventObserver来避免一些重复的模板代码。...不会因为Activity的销毁而崩溃:如果观察者的生命周期处于非活动状态,例如在后堆栈中的活动,那么它就不会收到任何LiveData事件。...Jose的解决方案缺乏对多个观察者的支持,而这正是LiveData以 "共享资源 "为名的承诺之一。 它不是线程安全的。 我还可以补充一个问题。
预防小贴士 保持基本的手部和呼吸道卫生,坚持安全饮食习惯,并尽可能避免与任何表现出有呼吸道疾病症状(如咳嗽和打喷嚏等)的人密切接触。...简而言之,这个库可以帮助开发者更好地处理生命周期事件和配置更改时的数据持久性,同时还能帮助开发者创建更好的体系结构应用程序,并避免难以维护和测试的膨胀类。...当添加一个Observer时,它将接收导致当前状态的所有事件。举例来说,如果Lifecycle目前在RESUMED状态,则观察员将收到ON_CREATE,ON_START和ON_RESUME事件。...④ postValue(T value):在子线程中给LiveData设置值。...这些代码通常会导致Activity/Fragment变得非常臃肿,这样的代码会难以扩展和维护。
然而,这种模式会导致代码不好管理,容易出现错误。通过支持生命周期的组件,可以将原本在生命周期方法里的操作移到组件内部。...虽然组件的生命周期不由我们控制,但是我们必须尊重组件的生命周期,不然很可能会导致内存泄漏甚至崩溃。...Lifecycle.Event.ON_RESUME) fun connectListener() { ... } @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE...例如,如果回调在保存活动状态后运行 Fragment 事务,那么它将触发崩溃,因此我们永远都不想调用该回调。 为了简化此用例,Lifecycle 类允许其他对象查询当前状态。...这让视图更具声明性,并减少在 UI 控制器的更新代码。如果你倾向于使用 Java ,可以使用 Butter Knife 减少重复代码。
今天继续MVVM旅程,一起看看LiveData的有关问题: LiveData 是什么? LiveData 为什么被设计出来,解决了什么问题? 说说LiveData原理。 LiveData 是什么?...LiveData 是一种可观察的数据存储器类。...var liveData = MutableLiveData() liveData.observe(this, object : Observer {...{ } }) liveData.setVaile("xixi") //子线程调用 liveData.postValue...不会因 Activity 停止而导致崩溃 如果观察者的生命周期处于非活跃状态(如返回栈中的 Activity),则它不会接收任何 LiveData 事件。
这就意味着不会再有因Activity停止而导致的崩溃了。而且,由于LiveData的可观察性控制了事件的触发,我们就不需要手动处理生命周期。...这意味着我们可以将LiveData对象保存到数据库中,之后再将其作为普通的LiveData进行观察。这让我们可以在代码中的一个地方保存数据,并让另一个地方的代码,观察它数据的改变。...你可以使用RX或Kotlin的coroutines对操作者和线程控制进行更有力的控制。LiveData并不能对你的线程管理提供完全的控制权。...LiveData基本上有两种选择:同步更新或从工作线程发布异步值。...这也可以说是一种优势,如果你不需要完全的控制,而只是知道变化会命中UI线程,而不需要任何额外的切换线程的步骤,这听起来像是在某些情况下的一种优势。 5.
3.activity stop之后,不会崩溃 Livedata 把 activity 生命周期合并分成了inactive与active两种状态(start 与 resume 为 active,其他为inactive...6.适应屏幕旋转的数据保存 像屏幕旋转导致的 activity 或 fragment重创建之后,Livedata 会立即通知一下相应的观察者。保证了数据不会丢失。...7.共享资源 您可以使用单例模式扩展LiveData对象并包装成系统服务,以便在应用程序中进行共享。...注意:必须要从主线程调用setValue(T) 方法来更新LiveData 对象. 如果代码在工作线程中执行, 你可以使用postValue(T) 方法来更新LiveData对象....setValue(T)方法更新LiveData实例的值,并通知活动观察者有关更改。
不会因停止Activity而发生崩溃 如果Observer的生命周期处于非活跃状态,例如在后退堆栈中的Activity,就不会收到任何LiveData事件的通知。...7.共享资源 您可以使用单例模式扩展LiveData对象并包装成系统服务,以便在应用程序中进行共享。...onStart()日志,因为我们将liveData的值和Fragment的生命周期进行了绑定,当返回桌面或者销毁Fragment的时候,LiveData的值会变成相应的生命周期函数,并打印在控制台中:...源码分析: 3.1 observer() 我们声明了一个LiveData对象,并通过监听Fragment的生命周期来改变LiveData中的value值,LiveData实际上就像一个容器,Demo中存储了一个...,再发送通知; LiveData在DESTROYED时会移除Observer,取消订阅,不会出现内存泄漏 postValue在异步线程,setValue在主线程 如果LiveData没有被observe
3.当Activity停止时不会引起崩溃 这是因为组件处于非激活状态时,不会收到LiveData中数据变化的通知。...MutableLiveData是LiveData的子类,添加了公共方法setValue和postValue,方便开发者直接使用。setValue必须在主线程调用。...MyData内部实现一个简单的功能,后台运行一个长时的线程任务,该线程实现一个简单功能: (a)如果当前的Activity处于运行(用户可见)状态,则线程任务不断累计计数器并postValue一个值给任何...(b)如果当前Activity处于没有激活状态,则暂停线程任务,停止累计计数器。 (a)(b)两个功能由一个线程任务完成,具体实现可参见附录文章1。...在LiveData中的数据变化,通过postValue(可后台线程)或者setValue(主线程)设置后,将触发Observer的onChanged,开发者只需onChanged等待最新数据回调即可。
SystemClock.elapsedRealtime() - countTime); start(); } //对应生命周期的注解 @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE...private void onResume() { Log.i(TAG, "onResume"); } @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE...使用,ViewModel的生命周期是独立于Activity的 三、LiveData LiveData对象提供了可观测方法,当数据发送改变时,观测方能够观测到,并且线程安全,集成了LifeCycle的绑定生命周期特性...1.来实现一个定时器,线程中更新定时时间,使用LiveData使得ui上进行更新 布局文件很简单,一个TextView <?...LiveData的值,ui线程中使用setValue方法设置LiveData的值,非ui线程使用postValue方法 package com.aruba.livedata; import androidx.appcompat.app.AppCompatActivity
不会因Activity停止而导致崩溃 如果观察者的生命周期处于非活跃状态(如返回栈中的 Activity),则它不会接收任何 LiveData 事件。...()对LiveData所包装的数据进行观察,我们也可以通过Livedata的postValue()或Livedata的setValue()来完成修改数据,postValue()用在非UI线程中,setValue...()用在UI线程中。...扩展LiveData LiveData的优势之一就是共享资源,将LiveData类实现一个自定义单例。...//aLiveData监听bLiveData内容的变化,变化时将bLiveData转换为相应的内容并通知aLiveData liveData = Transformations.map(homeViewModel.getCurrentValue
2、LiveData如何感知生命周期? 总结:首先看数据:LiveData中的 mObservers 和 LifecycleRegistry 中的 mObserverMap。...Override public void onPause() { super.onPause(); dispatch(Lifecycle.Event.ON_PAUSE...至此:当lifecycle发生变化时,handleLifecycleEvent 会通过 getStateAfter()方法获取当前应处的状态并修改mState值,紧接着遍历所有 ObserverWithState...并调用他们的sync方法来同步且通知LifecycleObserver状态发生变化。...,第一种setValue(),在主线程中使用 而 postValue在异步线程中使用: @MainThread protected void setValue(T value)
消息传递既可以用于Android四大组件之间的通信,也可用于异步线程和主线程之间的通信。...LiveData是一个可以被观察的数据持有类,它可以感知并遵循Activity、Fragment或Service等组件的生命周期。...不会再产生由于Activity处于stop状态而引起的崩溃,例如:当Activity处于后台状态时,是不会收到LiveData的任何事件的。...Room,通过它可以非常优雅的让数据与界面进行交互,并做一些持久化的操作,高度解耦,自动管理生命周期,而且不用担心内存泄漏的问题。...而每个新的订阅者,其version都是-1,LiveData一旦设置过其version是大于-1的(每次LiveData设置值都会使其version加1),这样就会导致LiveDataBus每注册一个新的订阅者
Kotlin1.3版本添加了 Coroutines,并基于其他语言的既定概念。 在Android上,协程有助于解决两个主要问题: 管理长时间运行的任务,否则可能会阻止主线程并导致应用冻结。...网络请求,JSON解析,从数据库读取或写入,甚至只是迭代大型列表都可能导致应用程序运行缓慢,导致可见的缓慢或冻结的UI对触摸事件响应缓慢。这些长时间运行的操作应该在主线程之外运行。...这应该仅用于与UI交互并执行快速工作。 示例包括调用挂起函数,运行Android UI框架操作以及更新LiveData对象。...然后,即使网络库多次使用withContext(),它仍然停留在同一个调度程序上,并避免切换线程。...这些丢弃的异常不会出现在崩溃指标中,也不会出现在logcat中。 并行分解 当函数返回时,必须停止由挂起函数启动的所有协同程序,因此您可能需要保证这些协程在返回之前完成。
1、LiveData 只能在主线程更新数据: 只能在主线程 setValue,即使 postValue 内部也是切换到主线程执行; 2、LiveData 数据重放问题: 注册新的订阅者,会重新收到 LiveData...比如在子线程大量 postValue 数据但主线程消费跟不上时,中间就会有一部分数据被忽略。...将切换到主线程并调用 setValue(临时变量)。...1(背压问题):使用 postValue() 异步设置数据,并且观察者的消费速度小于数据生产速度; 情况 2:在观察者处理回调(Observer#obChanged())的过程中重新设置新数据,此时会中断旧数据的分发...}); 4.3 如何加强 LiveDataBus 事件约束 无论是 EventBus 还是 LiveDataBus 都没有对事件定义进行约束,不同开发者 / 不同组件可能会定义相同的事件字符串而导致冲突
很常见的一点就是可以减少内存泄漏和崩溃情况了呀,想想以前你的项目中针对网络接口返回数据的时候都要判断当前界面是否销毁,现在LiveData就帮你解决了这个问题。 具体为什么能解决崩溃和泄漏问题呢?...不会因 Activity 停止而导致崩溃如果观察者的生命周期处于非活跃状态(如返回栈中的 Activity),则它不会接收任何 LiveData 事件。...这里要注意的是setValue方法只能在主线程调用,而postValue则是在其他线程调用。...当Fragment这个观察者生命周期发生变化时,LiveData就会移除这个观察者,不再发送消息,所以也就避免崩溃问题。...在Activity中,难免有些异步调用,所以就会容易导致界面销毁时候,这些调用还存在。那就会发生内存泄漏或者直接崩溃。
这时,View的引用可能会被破坏,也可能是一个不再可见的旧Activity,产生内存泄漏,并可能导致崩溃。 ❌ 避免在ViewModels中对View进行引用。...它将与你的应用程序的其他部分通信,并更新ViewModel中的LiveData持有者。 添加一个Domain layer并采用Clean Architecture。...这将导致一个非常可测试和可维护的架构。它也有利于快速离开主线程。在Architecture Blueprints中有一个Clean Architecture的例子。...; 该Activity接收该值并显示Snackbar。这显然是有效的。 然而,如果用户旋转手机,新的Activity被创建并开始观察。...当LiveData观察开始时,该Activity立即收到旧的值,这导致消息再次显示出来。 与其试图用库或架构组件的扩展来解决这个问题,不如将其作为一个设计问题来面对。
LiveData如何实现数据更新 LiveData如何实现同activity声明周期绑定 viewModel如何实现数据共享 viewModel如何实现数据保存 本文就如上问题结合aac框架源码进行逐步解析.../** * Constant for onPause event of the {@link LifecycleOwner}. */ ON_PAUSE...//noinspection unchecked setValue((T) newValue); } }; 而postValue只是post到主线程...getCurrentState获取 则Lifecycle通过getCurrentState()可以取到当前activity的声明周期了 看看为什么不会导致内存泄漏 @MainThread public...都有判断当前activity是否destroyed,由此可见,activity销毁了,并不会执行数据更新,自然不会有内存泄漏 三.viewModel如何实现数据共享 主要是同一个HolderFragment,导致有同一个
虽然我们今日才发布稳定版,其测试版组件早已被整合进达十亿量级下载的 App 中。架构组件帮助很多顶级开发团队,如 Zapppos,将更多的时间集中在更为关键的工作中。 ?...生命周期管理(Lifecycles)帮助开发者创建 “可感知生命周期的” 组件,让其自己管理自己的生命周期,从而减少内存泄露和崩溃的可能性。生命周期库是其他架构组件(如 LiveData)的基础。...直到关联的 Activity 或 Fragment 完全销毁时,ViewModel 才会随之消失,也就是说,即使在旋转屏幕导致 Fragment 被重新创建等事件中,视图数据依旧会被保留。...而且 Room 可以和 LiveData 集成在一起,提供可观测数据库并感知生命周期的对象。Room 集简洁、强大和可靠性为一身,在管理本地储存上表现卓越,我们强烈推荐各位开发者试用一下。...各位一直翘首以盼稳定版的朋友们,何不今天就开始下载使用?
领取专属 10元无门槛券
手把手带您无忧上云