/usr/bin/env bash export VAR="HELLO, VAR" 当我执行脚本并尝试访问 $VAR 时,我没有得到任何值!...echo $VAR 有没有一种方法可以通过只执行 export.bash 而不 source 它获取 $VAR? 答: 不可以。 但是有几种可能的解决办法。...最明显的方法,你已经提到过,是使用 source 或 ....在调用 shell 的上下文中执行脚本: $ cat set-vars1.sh export FOO=BAR $ . set-vars1.sh $ echo $FOO BAR 另一种方法是在脚本中打印设置环境变量的命令.../set-vars2.sh)" $ echo "$FOO" BAR 在终端上执行 help export 可以查看 Bash 内置命令 export 的帮助文档: # help export export
因为它们的生命周期不在我们的控制之下,它们可以在任何时候根据用户的互动或其他因素(如低内存)被销毁。如果我们在一个UI组件中创建和处理我们的数据,一旦该组件被销毁,我们所有的数据都会被销毁。...我希望你能从这篇文章中获得一些关于LiveData的知识,了解它在哪些情况下可以提供帮助,如何使用它,以及为什么它可能是一个比其他现有方法更好的解决方案。有其他想法吗?有更好的解决方案吗?...因此,肯定会有一种试图最大限度地利用它们的诱惑:) 在这篇文章中,我将谈谈在什么情况下我不推荐使用LiveData,以及你可以使用的替代方案。...你可以使用RX Flowable或Kotlin的Flow来正确处理这个问题。下面的图片展示了背压的正确处理。在你使用LiveData的情况下,9,10,11的值将被丢弃,以提供最新的值。...这也可以说是一种优势,如果你不需要完全的控制,而只是知道变化会命中UI线程,而不需要任何额外的切换线程的步骤,这听起来像是在某些情况下的一种优势。 5.
在进程终止的时候你没有机会持久化数据。因此如果你想最大可能的保持数据不丢失,你应该在用户一进入(activity)的时候就进行持久化。...如果你允许在类似设备突然关机的情况下丢失数据,你可以在 'onStop()'回调的时候将其保存,这个方法在 activity 一进入后台的时候就会被调用。...ViewModel 与其他架构组件 LiveData 和 Room 一起使用可以替代 Loader。ViewModel 保证配置更改后数据不丢失。LiveData 保证 UI 与数据同步更新。...结合 ViewModel 和 LiveData 一起使用可以代替 Loader。你可以使用 Room 来代替 CursorLoader 的功能。...如果你有关于 ViewModel 或者任何架构组件的问题,请查看我们的反馈页面。关于本系列的任何问题,敬请留言。
在进程终止的时候你没有机会持久化数据。因此如果你想最大可能的保持数据不丢失,你应该在用户一进入(activity)的时候就进行持久化。...如果你允许在类似设备突然关机的情况下丢失数据,你可以在 'onStop()'回调的时候将其保存,这个方法在 activity 一进入后台的时候就会被调用。...ViewModel 与其他架构组件 LiveData 和 Room 一起使用可以替代 Loader。ViewModel 保证配置更改后数据不丢失。LiveData 保证 UI 与数据同步更新。...结合 ViewModel 和 LiveData 一起使用可以代替 Loader。你可以使用 Room 来代替 CursorLoader 的功能。...如果你有关于 ViewModel 或者任何架构组件的问题,请查看我们的反馈页面。关于本系列的任何问题,敬请留言。 掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为 掘金 上的英文分享文章。
LiveData对象一旦连接到系统服务,任何需要该资源的Observer都只需观察这个LiveData对象。 如何使用LiveData? 1.创建一个LiveData的实例来保存特定类型的数据。...所以我们需要在一开始就设置好观察。 通常情况下,LiveData只在数据有变化时,给活跃的Observer进行通知。 此行为的一个例外是,Observer在从非活跃状态变为活跃状态时也会收到通知。...MutableLiveData类暴露公用的setValue(T)和postValue(T)方法,如果需要编辑存储在LiveData对象中的值,必须使用这两个方法。...转换LiveData 您可能希望先转换存储在LiveData对象中的值,然后再将其分派给Observer,或者您可能需要根据一个LiveData实例的值返回不同的LiveData实例。...Transformations.map() 使用一个函数来转换存储在LiveData对象中的值,并向下传递转换后的值。
LiveData的主要问题: postValue在异步线程可能丢失数据:源码中新建Runnable的时候,只对mPendingData进行了修改,并不是加入线程池,导致数据丢失 对数据流的处理能力偏弱:...由此可见,LiveData作为一个数据观察者的实现,完全是可以脱离ViewModel单独在Activity中使用的,但是,这样做与直接使用RxJava之类的异步框架并没有太大区别,Google这套AAC...借助委托,我们可以很方便的去除这类getXXX的代码,在Ktx中,提供了下面的委托来获取ViewModel,代码如下所示。...但这样创建的ViewModel有个小问题,我们可以看下它的源码,在ViewModelProvider中,它默认的NewInstanceFactory是使用反射来创建VIewModel的无参构造函数的,如下所示...而且该协程构造器返回的是一个不可变的LiveData,可以直接暴露给对应的UI层使用,在作用域中,可以通过emit()函数来更新LiveData的数据。 这样整体流程就通了,而且,非常简单不是吗?
使用 LiveData 保存数据时,由于数据和组件是分离的,所以当组件被销毁时可以保证数据不会丢失。...二、 LiveData与ViewModel的关系 在Jetpack架构中,ViewModel的主要作用是存储各种数据,当然,我们也可以在ViewModel中处理一些数据逻辑。...例如,我们可以在ViewModel中对加载的数据进行某些加工操作。...通常,我们可以在UI控制器类中创建该Observer对象,如Activity或Fragment。 通过使用observe()方法将上述的LiveData对象和Observer对象关联在一起。...对象 在大多数情况下,我们可以应用组件的 onCreate() 方法中开始观察 LiveData 对象。
它可以实现当 Activity 状态发生变化诸如屏幕旋转的时候,数据能保存下来而不会丢失。...粘性消息特性以及适用场景 LiveData 默认是支持粘性消息的,也就是在 observe() 的时候可以拿到 observe() 之前赋给 LiveData 的值。...,如果要使用 LiveData 来实现非粘性消息(observe() 的时候不接收之前赋给 LiveData 的值),有各种 workaround 的方式,具体可以移步至我的另一篇文章:LiveData...非粘性消息的探索和尝试 LiveData 变换和组合 有时候我们希望对 LiveData 做一些变换或者其他处理再提供给 View 层使用,可以使用 Transforms 一对一的静态转换 —— map...如果使用 LiveData,因为 ViewModel 本身是不具备生命周期的,可以考虑使用 Transforms + LiveData;如果使用其他注册监听器的方式,可以在 ViewModel 的 onCleared
❝这些都不能被看作是纯粹的Flow的内在缺陷:这些只是使它不能很好地替代LiveData的特点,但在其他情况下却可以很强大。...在这种情况下,你可以通过使用Flow.asLiveData()扩展函数在ViewModel中轻松地从Flow转换为LiveData。...对于重放参数,我们可以使用1:新的订阅者将在订阅后立即获得最后一个发出的值。...状态流总是有一个初始值,向新的订阅者复制一个最新的值,不缓冲任何更多的值,但保留最后发出的一个值,并且不支持 resetReplayCache。...回答这个问题的简单方法是试图回答其他几个问题。 "我真的需要在任何时候用myFlow.value访问流的当前状态吗?" ❝如果这个问题的答案是否定的,你可以考虑SharedFlow。
很多时候,我们可能会收到一个不包含任何相关变化的通知。如果我们监听的是所有球员的名字,我们不想在分数发生变化时更新用户界面。这就是distinctUntilChanged方法的用处。...我在调解器创建时调用了更新函数,只有在两个源都是非空的情况下才会发出一个值。这种模式非常通用,但让我们一个一个地走完每一步。 方案1 在从这个LiveData发出任何东西之前,你想监控哪些源的变化。...为了简单起见,我通常调用我的更新函数,但只是设置MediatorLiveData的值/postValue也可以。在某些情况下,我不想发出一个初始值,因为我希望在a或b还没有设置的情况下发出空值。...方案4 由于MediatorLiveData是一个LiveData实例,我们可以设置值(像上面的例子)或调用postValue(如果由于某种原因,你在发射值时不在主线程上)。...这也是你决定如何转换源数据值的地方。上面的例子只是将aVal和bVal相加,但你当然可以在这里应用你想要的任何转换。
参考简答: ViewModel的作用在于解决Android应用中活动和碎片(Fragment)的生命周期问题。它允许数据在屏幕旋转等配置更改时存活,并确保数据在不同组件之间共享而不丢失。...ViewModel的存活周期: 使用ViewModel正确处理配置变化,保证数据在屏幕旋转等情况下不丢失。...问题: 请对比LiveData和Observable,分析它们在Android应用中的应用场景,以及在何种情况下选择使用哪种。...在高级任务调度中,我们可以: 自定义Worker: 实现Worker类以执行具体任务,并通过Constraints来定义任务的触发条件,如网络状态、电量等。...适度使用Room的内存缓存: 使用@Query注解的LiveData返回值时,Room会自动在内存中维护缓存,但要注意不要过度依赖,以免造成内存浪费。
但如果我们有一个流程,其中数据是连续排放的,我们可以使用: val someTypeLiveData: LiveData = stateFlow.asLiveData(...Connecting Multiple LiveData Source Emission 在这种情况下,我们有多个LiveDatas源数据,我们想控制数据输出的逻辑,我们也可以使用Coroutine Builder...Delay and Keep Coroutine Alive Temporarily 我们在liveData coroutine builder中的一个特殊功能是,它可以被配置为在LiveData不活动的特定时间内保持...如果它在之前的运行中成功完成,它不会重新启动。注意,只有在自动取消的情况下才会重新启动。如果该块因任何其他原因被取消(例如抛出一个CancellationException),它不会被重新启动。...如果coroutine在超时前完成,即使Activity还没有恢复,coroutine也不会被重新启动,而只是发出它的最后一个值。
State 状态:官方文档上说 State 状态是指可以随时间变化的任何值。例如,它可能是存储在 Room 数据库中的值、类的变量,加速度计的当前读数等。怎么理解这个概念呢?...可以看出,这些都是一种可观察数据变化的容器,被它们修饰的对象,我们都可以观察到该对象的变化,从而更新界面。没错,都是使用的观察者模式。...ViewModel 经常与 LiveData 一起使用,但在 Compose 中,推荐使用 MutableState 来具体存储数据的值。...所以,不要在有添加或移除 Composable 组件的情况下,使用 remember 将重要内容存储在 Composable 组件中,因为添加和移除都会使得数据丢失。 5....6.3 MapSaver Compose 还考虑到有些情况下 Parcelize 不适用的场景,那么还可以使用 MapSaver 来定义自己的存储和恢复规则,规定如何把对象转为可保存到 Bundle 中的值
State的值可以是任意类型:如像Boolean或者String一样的简单的基础类型,也可以是一个包含整个渲染到屏幕上的 UI 状态的复杂数据类型。...如果少写了代码行中的几个神秘关键字,会有什么问题吗?如果不使用mutableStateOf()?...无状态的可组合项是不持有自身状态的可组合项。它们在 Jetpack Compose 里有各自适用的场景。什么时候应该把可组合项设计成无状态可组合项?在大多数情况下,我们需要尽可能让可组合项保持无状态。...它本身不持有任何状态相关的实例——所以它自然就是一个无状态可组合项。什么时候应该把组合项设计成有状态组合项?...() } val state by homeViewModel.inputText // TODO use state}例外情况:把 TextInput 设计成有状态可组合项在一些特殊情况下我们可能需要考虑使用一个有状态的可组合项
答案显而易见,无非是想让数据使用者感知到而已,而LiveData可以优雅的实现这一流程,将 改变、通知 两步操作合并为一步 即省事也提高了安全性....LiveData + Lifecycle 实现 1 + 1 > 2 LiveData在Lifecycle的加持下可以实现只在可见状态接收通知,说的通俗一点Activity执行了onStop()后内部的LiveData...值,等回到ActivityA时 你肯定不希望Observer收到多次通知而引发textView多次重绘。...保证不丢失,二者搭配简直是天作之合。...ViewModel的onClear方法,可以在该方法做一些释放资源的操作,进一步降低内存泄露的风险 解除你对DataBinding的误解 使用DataBinding的作用有哪些?
runable 中,会直接去取最新待同步的值,然后将其置为默认值,最后执行真正的数据更新,即 setValue(); 不过需要注意的,多线程下调用,可能会丢失某次的通知。...具体我们看一眼官方对其的描述: ---- 但既然 LiveData 这么安全好用,所以就会有开发者想着使用 LiveData 用于事件通知,此时它的设计在某种程度上就成了问题,虽然在官方的建议里,非常不建议直接这么用...SingleLiveEvent 计算机科学领域一直流传着一句格言:任何问题都可以通过增加一个间接的中间层来解决。...相应的,在 Android上 面,Flow 也可以通过 asLiveData() 从而转为LiveData,由此兼容使用。...因为在不谈的背景的情况下,没有绝对的标准与统一的准则,那就更别提对与错。但至少对于 LiveData 而言,了解完本篇的你,我相信再也不会再有相关疑问。
上述代码采用的做法是,定义一个count变量,在Text控件中显示这个count变量的值,并且每次点击Button时让count变量加1。 思路非常简单,那么这段代码能正常工作吗?...: 0).plus(2) } } 这段代码和Compose没有任何关系,完全是纯粹的ViewModel和LiveData的用法。...但是传统LiveData的用法在Compose中并不好使,因为传统LiveData依赖于监听某个值的变化,并对相应的界面进行更新,而Compose的界面更新则依赖于重组。...说到StateFlow,它本来和LiveData的用法就极其相似,最大的不同点可能就在于StateFlow是用Kotlin编写的,它可以在初始化的时候就传入一个初始值,从而确保它的值永远不会为空。...因此我们在incrementCount()和incrementDoubleCount()函数里可以直接对其加1加2,而不用像之前LiveData那样写一段很奇怪的空指针保护代码了。
答案显而易见,无非是想让数据使用者感知到而已,而LiveData可以优雅的实现这一流程,将 改变、通知 两步操作合并为一步 即省事也提高了安全性....2.3 LiveData + Lifecycle 实现 1 + 1 > 2 LiveData在Lifecycle的加持下可以实现只在可见状态接收通知,说的通俗一点Activity执行了onStop()后内部的...值,等回到ActivityA时 你肯定不希望Observer收到多次通知而引发textView多次重绘。...保证不丢失,二者搭配简直是天作之合。...ViewModel的onClear方法,可以在该方法做一些释放资源的操作,进一步降低内存泄露的风险 4.
前言 LiveData 是一种持有可被观察的数据存储类,和其他可被观察的类不同的是,LiveData 是就要生命周期感知能力的,这意味着他可以在 Activity ,fragment 或者 service...LiveData 只会将数据更新给活跃的观察者。 在添加观察者的时候,可以传入 LifecycleOwner 。...,它会在变为活跃状态时接收最新数据 配置更改后也会接收到最新的可用数据 共享资源,可以使用单例模式扩展 LiveData 对象,以便在应用中共享他们 LiveData 的使用 LiveData 是一种可用于任何数据的封装容器...转换 LiveData Transformations.map() 在数据分发给观察者之前对其中存储的值进行更改,返回一个新的 LiveData,可以使用此方法 private val _state...一般情况下我们都需要的是最新数据,如果非要所有数据,只能重写 LiveData 了。 参考 Android Developers
领取专属 10元无门槛券
手把手带您无忧上云