MVVM架构使用的组件有ViewModel、LiveData、ViewBinding/DataBinding等,这些组件都是Jetpack库中的组件。...val repository: BmobRepository) : ViewModel() { var libraryRecommendData = MutableLiveDataMutableList...BmobRepository类中有一个挂起函数getAllRecommendLibrary(libraryRecommendData: MutableLiveDataMutableList>)用来获取云数据库中的数据...,函数的参数是LiveData,在获取数据后,利用setValue通知View展示数据。...中所有推荐开源项目 */ suspend fun getAllRecommendLibrary(libraryRecommendData: MutableLiveDataMutableList
由于新的类继承了具体的 ArrayList 类而不是实现 MutableList 接口,因此它与 ArrayList 的实现高度耦合。...如果只需要覆盖 remove() 函数来保持对已删除项目的引用,并将 MutableList 的其余空实现委托给其他对象,那该有多好啊。...通过桥接到内部 ArrayList 对象方法的方式,ListWithTrash 仍然支持 MutableList 接口中的所有函数。与此同时,现在您可以添加自己的行为了。...MVVM模式与ViewModel 我们也常常用LiveData来标识网络请求状态 我们需要定义请求开始,请求成功,请求失败,三个LiveData 这其实也是很冗余重复的代码,因此我们可以进行一定的封装...,封装一个带状态的LiveData 定义如下: typealias StatefulLiveData = LiveData> typealias StatefulMutableLiveData
不过这个倒不是本篇的重点,实际用到的这个场景应该比较少,本篇主要是说一下3.0版本中多级列表的实现方式,另外这个Demo中也是初次尝试MutableSharedFlow的来替代LiveData,使用中有些还没理解明白...get() = null } Head父级列表继承自BaseExpandNode,其中要定义其明细列表MutableList class Head : BaseExpandNode...() { var Bodys: MutableList?...= null var deptno: String = "" var deptname: String = "" override val childNode: MutableList...在Activity中先定义LifecycleCoroutineScope 监听Flow的数据改变,需要在onStart中实现,在onStop中还有停止监听 其实像我这么简单的数据来说,感觉还是用LiveData
由于新的类继承了具体的 ArrayList 类而不是实现 MutableList 接口,因此它与 ArrayList 的实现高度耦合。...如果只需要覆盖 remove() 函数来保持对已删除项目的引用,并将 MutableList 的其余空实现委托给其他对象,那该有多好啊。...通过桥接到内部 ArrayList 对象方法的方式,ListWithTrash 仍然支持 MutableList 接口中的所有函数。与此同时,现在您可以添加自己的行为了。...by bindToPreferenceFieldNullable() } 带状态的LiveData 目前我们在开发的过程中越来越多的使用MVVM模式与ViewModel 我们也常常用LiveData来标识网络请求状态...我们需要定义请求开始,请求成功,请求失败,三个LiveData 这其实也是很冗余重复的代码,因此我们可以进行一定的封装,封装一个带状态的LiveData 定义如下: typealias StatefulLiveData
这是将我们修改后 css文件复制到容器exampleApp4000中相同的位置覆盖旧的Css文件。 请把精彩打在弹幕板上。 这说明了每个容器都有自己的存储,对一个容器的修改不会影响到另一个。
不过在发信时却遇到了卡住“正在复制消息到Sent文件夹”的问题,虽然此时邮件已经成功发出,但点击关闭窗口却会提示是否保存草稿。
onDestroy() } 首先定义一个观察者接口,包含Activity/Fragment主要生命周期方法 第二步: class BaseActivity{ val observers = mutableList...根据LiveData的特性决定它非常适合去做数据驱动UI,下面举个例子简单描述下: # 需求:改变textView内容以及对应的数据,用LiveData实现方式如下 val liveData = MutableLiveData...() liveData?....LiveData + Lifecycle 实现 1 + 1 > 2 LiveData在Lifecycle的加持下可以实现只在可见状态接收通知,说的通俗一点Activity执行了onStop()后内部的LiveData...既然是状态托管框架那ViewModel的第一要务 就要时时刻刻保证最新状态分发到视图层,这让我不禁想到了LiveData,数据的承载以及分发交给Livedata,而ViewModel专注于托管LiveData
先不谈它有没有其他问题,但就其对LiveData的魔改包装给我的第一感受是强扭的瓜不甜,违背了LiveData的设计思想,其次它就没有别的问题了吗?...val testChannel: Channel = Channel() private val testChannelFlow = testChannel.receiveAsFlow () 复制代码...onBufferOverflow: BufferOverflow = BufferOverflow.SUSPEND ) 复制代码 //MutableStateFlow等价于使用如下构造参数的SharedFlow...MutableSharedFlow( replay = 1, onBufferOverflow = BufferOverflow.DROP_OLDEST ) 复制代码 SharedFlow...val loadStatus: LoadStatus, val refreshStatus: RefreshStatus, val noteList: MutableList
LiveData并不是只运用观察者模式 2.1 观察者模式的优点有哪些? 2.2 LiveData基于观察者模式又做了哪些扩展?...onDestroy() } 首先定义一个观察者接口,包含Activity/Fragment主要生命周期方法 第二步: class BaseActivity{ val observers = mutableList...根据LiveData的特性决定它非常适合去做数据驱动UI,下面举个例子简单描述下: # 需求:改变textView内容以及对应的数据,用LiveData实现方式如下 val liveData = MutableLiveData...() liveData?....既然是状态托管框架那ViewModel的第一要务 就要时时刻刻保证最新状态分发到视图层,这让我不禁想到了LiveData,数据的承载以及分发交给Livedata,而ViewModel专注于托管LiveData
onDestroy() } 首先定义一个观察者接口,包含Activity/Fragment主要生命周期方法 第二步: class BaseActivity{ val observers = mutableList...根据LiveData的特性决定它非常适合去做数据驱动UI,下面举个例子简单描述下: # 需求:改变textView内容以及对应的数据,用LiveData实现方式如下 val liveData = MutableLiveData...() liveData?....举个例子: ActivityA和ActivityB共享同一个LiveData,伪代码如下 class ActivityA{ liveData?....既然是状态托管框架那ViewModel的第一要务 就要时时刻刻保证最新状态分发到视图层,这让我不禁想到了LiveData,数据的承载以及分发交给Livedata,而ViewModel专注于托管LiveData
现在,英特尔正在研发新一代人工智能芯片,集成超过 13 万个神经元和 1.3 亿个突触,用复制神经的方式进行运算和思考,让创新科技开创人工智能新纪元。 ?...我们对于大量动态的、非结构化的自然数据的收集、分析和决策的日益增长的需求,正在驱动对于强大的计算力逐渐增长的需求,这一需求或许已经超过了传统 CPU 或者 GPU 计算力增长的速度。...我们真诚地希望这次里程碑似的发布能够引起社会广泛的关注,因为英特尔正在将神经计算等前瞻性概念推向主流科研领域,这对于世界未来 50 年的经济发展有着重要的意义。
的情况 val userId : LiveData = _userId 复制代码 如需了解更多,请移步至 Lifecycles Codelab 第六步和官方文档。...ViewModel 通常都包含一些 LiveData,而 LiveData 意味着可以被监听。...通过 ViewModel、LiveData 和 Data Binding 的组合,您可以移除以往给 LiveData 添加观察者的做法,改为直接在 XML 中绑定 View Model 和 LiveData...如果它是 LiveData,那么 UI 将根据 LiveData 值的改变自动刷新。...例如,假设您正在准备将一个位图 (bitmap) 显示到屏幕上。这种操作就符合我们前面提到的一些特征: 既不能在执行时阻塞主线程,又要求在用户退出相关界面时停止执行。
get() = _billLiveData fun pay(msg: String) { _billLiveData.value = msg } } 复制代码...viewModel.billLiveData.observe(this, Observer { Log.d("sample", it) }) } } 复制代码...运行之后会不做任何操作会输入如下日志: sample: 小明付款了 100 元 复制代码 这里其实不符合预期的,小明是在之前付款了 100 元,而我是在之后才开始监听,此刻并不需要通知我之前发生的事情...(this, observer1) viewModel.liveData.observe(this, observer2) } } 复制代码 我们在 observer1 中修改了...name 是不可变的 复制代码 这样可以有效防止在 observer 中修改 LiveData 数据的问题 case 3:重复添加 observer class MvvmActivity : AppCompatActivity
android:text="@{name}" android:layout_width="wrap_content" android:layout_height="wrap_content"/> 复制代码...android:layout_width="wrap_content" android:layout_height="wrap_content"/> 复制代码 或者,如果您是通过 ViewModel...替换前: class MyViewModel : ViewModel() { val name = ObservableField("Ada") } 复制代码 替换后: class... = _name // Expose the immutable version of the LiveData } 复制代码 第二步: 设置 LiveData 的生命周期所有者 视图的绑定类中包含一个...TheGeneratedBinding>( this, R.layout.activity_data_binding ) binding.name = myLiveData // or myViewModel 复制代码
typealias FileTable = MutableMapMutableList> typealias OnPermissionResult = ActivityCompat.OnRequestPermissionsResultCallback...以上面代码块中的 FileTable 为例,一眼看过去,你能发现它是一个 MutableMapMutableList> 吗?肯定不能。...我用 LiveData 还是用事件总线?我用 ViewBinding 还是 DataBinding ?......
所谓ISV,其全称是IndependentSoftware Vendors,独立软件开发者,钉钉在消费端成功后,正在吸引越来越多的ISV,形成繁荣的企业应用经济。...不到两年的时间,钉钉第三方开发者生态已十分繁荣,正在形成类似于AppStore的繁荣生态。...而从市场覆盖来看,钉钉目前已经覆盖中国每一个地区,实现全面覆盖后正在向195个全球化市场进军。...更重要的是,我看到钉钉的开放生态已十分繁荣,钉钉凭借着企业客户这一端的成功,正在吸引更多开发者来满足企业和用户,进而形成正循环,有机会在企业级服务市场复制苹果AppStore“应用经济”的奇迹。
inc() } } 复制代码 class MvvmActivity : AppCompatActivity() { private val viewModel by viewModels...LiveData LiveData 也是官方提供的,用于提供可被监听的数据,且具有生命周期感知能力的组件。...粘性消息特性以及适用场景 LiveData 默认是支持粘性消息的,也就是在 observe() 的时候可以拿到 observe() 之前赋给 LiveData 的值。...,如果要使用 LiveData 来实现非粘性消息(observe() 的时候不接收之前赋给 LiveData 的值),有各种 workaround 的方式,具体可以移步至我的另一篇文章:LiveData...---- 相关文章: LiveData 的正确使用姿势以及反模式 LiveData 非粘性消息的探索和尝试 自定义生命周期以及实现生命周期感知能力
= null) { Toast.makeText(this, "到账$it元", Toast.LENGTH_SHORT).show() } }) 复制代码 class MoneyReceivedViewModel...= null } } 复制代码 缺陷: 需要在 observer 中增加一些逻辑判断代码,这不符合简洁的 MVVM 模式(不应该在 View 层做过多的逻辑处理) 需要手动重置,不够优雅,一旦忘记重置就容易引发问题...setValue(null) } companion object { private const val TAG = "SingleLiveEvent" } } 复制代码...* Returns the content, even if it's already been handled. */ fun peek(): T = content } 复制代码...get() = _billEvent fun payForEvent(msg: String) { _billEvent.value = Event(msg) } } 复制代码
但是,LiveData 支持 Transformations 和很多架构组件,比如 Room 和 WorkManager。 出于这些原因,建议你迁移到 LiveData。你只需要两步即可完成。...:text="@{name}" android:layout_width="wrap_content" android:layout_height="wrap_content"/> 复制代码...android:layout_width="wrap_content" android:layout_height="wrap_content"/> 复制代码 或者,如果你从 ViewModel...修改前: class MyViewModel : ViewModel() { val name = ObservableField("Ada") } 复制代码 修改后: class... = _name // Expose the immutable version of the LiveData } 复制代码 第二步:设置 LiveData 的生命周期所有者 绑定类有一个名为
Livedata 概览 LiveData 是一种可观察的数据存储器类。...LiveData 只会将更新通知给活跃的观察者。为观察 LiveData 对象而注册的非活跃观察者不会收到更改通知。 您可以注册与实现 LifecycleOwner 接口的对象配对的观察者。...TransMapViewModel: ViewModel() { fun sendData() { userLivedata.value=User("李白",1200)//对userLivedata进行复制...logEE(it) }) btn_switchmap.setOnClickListener { model.sendData() } 复制代码...} } } model 中创建了三个 Livedata,其中两个分别是 livedata1 和 livedata2,分别对应其中两个按钮。
领取专属 10元无门槛券
手把手带您无忧上云