这让我们可以把属性的 getter-setter 逻辑从属性声明的地方移动到(或者说委托给)另一个类,以达到逻辑复用的目的。...如你所见,委托属性并没有什么神奇的。但是,它虽然简单,却非常有用,让我们来看一些在 Android 开发中的例子。 你可以在官方文档中了解更多关于委托属性的内容。...ReadWriteProperty 是一个接收两个类型参数的泛型接口。我们把第一个设置成Fragment,即保证这个委托只能用于Fragment的属性。...Kotlin Android Extension的视图绑定来获取布局中的控件。...总结 我们看来一些在 Android 开发中使用 Kotlin 委托属性的例子。当然了,你也可以用别的方式来使用它。 这篇文章的目标是展示委托属性是多么强大,以及我们可以用它做什么。
-ktx 软件包会包含 Kotlin 的扩展: // 获取最新 Lifecycle 库的版本信息 // https://developer.android.google.cn/jetpack/androidx...当您观察一个 LiveData 对象时,您必须实现 Observer 接口。但是使用 lifecycle-ktx 的 observe 函数后,代码会变得更加简洁。...要实例化 ViewModel,可以使用 viewModels 委托 (详阅: Kotlin Vocabulary | Kotlin 委托代理): by ViewModels(factory): ViewMode...使用协程时,您可能会在 ViewModel 中启动一个协程。当 ViewModel 被销毁时,需要取消协程任务的执行。...使用 viewModelScope 后,您不需要实现 CoroutineScope,协程任务的取消会在 viewModel.onCleared() 函数中自动执行。
-ktx 软件包会包含 Kotlin 的扩展: // 获取最新 Lifecycle 库的版本信息 // https://developer.android.google.cn/jetpack/androidx...// 获取最新 Core 库的版本信息 // https://developer.android.google.cn/jetpack/androidx/releases/core3def corektx_version...当您观察一个 LiveData 对象时,您必须实现 Observer 接口。但是使用 lifecycle-ktx 的 observe 函数后,代码会变得更加简洁。...要实例化 ViewModel,可以使用 viewModels 委托 (详阅: Kotlin Vocabulary | Kotlin 委托代理): by ViewModels(factory): /* Copyright...使用 viewModelScope 后,您不需要实现 CoroutineScope,协程任务的取消会在 viewModel.onCleared() 函数中自动执行。
比如你一个界面数据由多个接口串联、并联组合起来,或者经过多次变换,再或者需要不断更新,这样的需求才是「异步数据流」,而平时大部分的业务开发,都是一个接口完事,所以,这样的需求使用Flow,就有点大材小用了...架构的推荐方式就是: Activity中获取ViewModel ViewModel中通过LiveData管理数据 Activity中通过ViewModel获取LiveData订阅数据 这种方式的好处就是比...和Fragment等LifecycleOwner中获取到正确的状态,从而避免了各种内存泄漏问题,而且可以封装到代码无感知,业务使用者完全不需要处理生命周期就可以避免大部分的泄漏,在简化代码的同时,也提高了性能...借助委托,我们可以很方便的去除这类getXXX的代码,在Ktx中,提供了下面的委托来获取ViewModel,代码如下所示。...使用的时候,viewModels的委托已经给出了自定义Factory的入口。
ViewModelScope,顾名思义,在ViewModel中使用的协程。 它是ViewModel的扩展属性。...实现Closeable接口,并重写唯一方法close(),并在方法中取消了协程。 现在我们已经知道了viewModelScope是可以取消的了,关键就在于取消时机的控制了。...在父类中通过ReportFragment或ActivityLifecycleCallbacks接口来派发当前生命周期状态,具体使用哪种派发方式要看Api等级是否在29(10.0)及以上,及 则后者。...首先在创建ViewModel的时候,会通过ViewModelStore以HashMap的形式把ViewModel保存起来; 随后我们在调用viewModelScope的时候,会在ViewModel中以HashMap...ok,以上就是ViewModelScope的使用,以及源码分析。
它并不 直接使用,而是由子类继承然后调用相应方法。...常用字段: public int icon 获得该资源图片在R文件中的值 (对应于android:icon属性) public...int labelRes 获得该label在R文件中的值(对应于android:label属性) public String name 获得该节点的name...ApplicationInfo类 继承自 PackageItemInfo 说明:获取一个特定引用程序中节点的信息。...类中的loadIcon()和loadLabel() ResolveInfo类 说明:根据节点来获取其上一层目录的信息,通常是、、<service
关于AndroidQF AndroidQF,全称为Android快速取证(Android Quick Forensics)工具,这是一款便携式工具,可以帮助广大研究人员快速从目标Android设备中获取相关的信息安全取证数据...AndroidQF旨在给广大研究人员提供一个简单且可移植的跨平台实用程序,以快速从Android设备获取信息安全取证数据。...它的功能有些类似于mvt-android,但是跟MVT相比,AndroidQF的优势就在于它可以让很多不懂技术的用户也能够轻松地使用。...工具使用 在启动AndroidQF之前, 我们需要将目标Android设备通过USB线连接到我们的主机上,别忘了开启USB调试功能。 启动USB调试之后,我们就可以继续启动AndroidQF了。...获取到加密的取证文件之后,我们可以使用下列方式进行解密: $ age --decrypt -i ~/path/to/privatekey.txt -o .zip .zip.age
在 clear() 方法中,ViewModel 会取消 viewModelScope 中的任务。...Closeable 接口。...单元测试 viewModelScope Dispatchers.Main 利用 Android 的 Looper.getMainLooper() 方法在 UI 线程执行代码。...这个方法在 Instrumented Android 测试中可用,在单元测试中不可用。...学习一下怎样在 Android 应用中使用协程吧。
在 clear() 方法中,ViewModel 会取消 viewModelScope 中的任务。...Closeable 接口。...这个方法在 Instrumented Android 测试中可用,在单元测试中不可用。...如果你使用 ViewModel 和协程, 通过 viewModelScope 让框架管理生命周期吧!不用多考虑了! Coroutines codelab 已经更新并使用它了。...学习一下怎样在 Android 应用中使用协程吧。 文章开头的 本文永久链接 即为本文在 GitHub 上的 MarkDown 链接。
使用@Database注释的类应满足以下条件: 继承了 RoomDatabase 的抽象类 在注解中包含与数据库相关联的实体类列表 包含一个无参抽象方法,并返回使用 @Dao 注释的类。...在运行时,你可以通过调用 Room.databaseBuilder()或 Room.inMemoryDatabaseBuilder()来获取 Database 实例 Entity 数据库中的表...DAO 包含用于访问数据库的方法 该应用程序使用 Room 数据库来获取与该数据库关联的数据访问对象或 DAO。...然后,应用程序使用每个 DAO 从数据库中获取实体,并将对这些实体的任何更改保存回数据库。最后,应用程序使用实体来获取和设置与数据库中的表列对应的值 Room 组件关系图 ?...在最常见的示例中,Repository 实现了用于决定是从网络获取数据还是使用在本地数据库中缓存的结果的逻辑,既避免了 ViewModel 和数据的直接交互又统一了单一真实数据源的逻辑 Repository
此外,当两项更新以出人意料的方式发生冲突时,也很容易造成异常状态。例如,某项更新可能会尝试设置刚刚从界面中移除的节点的值。一般来说,软件维护的复杂性会随着需要更新的视图数量而增长。...remember 和 mutableStateOf 在 Composable 函数中几乎永远都是配套使用的。 使用 by 关键字替代了之前的等号,用委托的方式来为 count 变量赋值。...pagingSourceFactory 函数用于创建一个实现 PagingSource 接口的数据源。...然后使用 cachedIn () 函数,将流缓存在 viewModelScope 中,以便在组件重新合成时保留数据状态。...综上所述,这段代码的作用是创建一个可流式访问的分页数据流,并将其缓存在 viewModelScope 中,以便在组件生命周期内保留数据状态。
详细了解更多,请参阅: 主题演讲: Jetpack Navigation 的主题演讲 v.youku.com/v_show/id_X… 官方文档: 以编程方式与导航组件交互 developer.android.google.cn...而在 ViewModel 中,我们可以使用 viewModelScope 来管理协程的作用域。...使用协程进行此类操作时,就应当使用 viewModelScope。 viewModelScope 是一个 ViewModel 的 Kotlin 扩展属性。...这样一来,只要您使用了 ViewModel,您就可以使用 viewModelScope 在 ViewModel 中启动各种协程,而不用担心任务泄漏。...中使用协程: viewModelScope medium.com/androiddeve… 官方文档: 将 Kotlin 协程与架构组件一起使用 developer.android.google.cn
文章目录 一、MainScope 协程作用域 二、取消 MainScope 协程作用域 三、Activity 实现 CoroutineScope 协程作用域接口 常见的 CoroutineScope..., 如果 Activity 被销毁 , 则 在 onDestory 生命周期函数中取消协程任务 ; viewModelScope : 该作用与仅在 ViewModel 中使用 , 与 ViewModel...是一个 函数 , 其返回值类型为 CoroutineScope 协程作用域 ; 这是使用了设计模式中的 工厂模式 , 生产一个 协程作用域 实例对象 ; 之后的 协程操作都要定义在该协程作用域中 ;...---- 通过委托方式 , 继承 CoroutineScope 接口 , public interface CoroutineScope { public val coroutineContext...import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.util.Log import
文章目录 一、viewModelScope 作用域作用 二、viewModelScope 作用域示例 常见的 CoroutineScope 协程作用域 : GlobalScope : 该作用域是 进程级别的...生命周期函数中取消协程任务 ; viewModelScope : 该作用与仅在 ViewModel 中使用 , 与 ViewModel 生命周期绑定 ; lifecycleScope : 该作用与仅在...Activity 中使用 , 与 Activity 生命周期绑定 ; 一、viewModelScope 作用域作用 ---- viewModelScope 协程作用域 需要绑定 ViewModel 生命周期..., 在特定界面中 , 如可旋转屏幕的 Activity 界面中 , 如果使用 MainScope 协程作用域 , 当屏幕旋转时 , 就会在 onDestory 生命周期函数中 取消协程作用域 , 此时协程相关的临时数据都被取消了...-- 布局主要内容 --> 使用 " Alt + 回车 " 快捷键 , 弹出如下下拉菜单 ,
、构造函数注入 和Dagger相同,Hilt也分两种注入方式,以上篇Dagger中的代码为例子,来对比两个框架的使用区别 1.gradle中配置依赖 工程gradle中导入插件: dependencies...ViewModelComponent是新出的子组件,对应的作用域为ViewModelScope,作用为:一个ViewModel中多个同类型注入对象,则使用同一份实例。...以前实现ViewModel中注入还需要依赖其他框架,这次来使用ViewModelScope作为例子 4.1 定义注入类,并使用@ViewModelScope注解 注意:如果把参数放入主构造,并且赋了默认值...,@Qualifier注解相当于为其取了个别名,在使用对象注入时也相应的使用@Qualifier注解,即可得到对应的注入对象 5.1 @Named解决注入冲突 @Named注解源码中,使用了@Qualifier...当我们有一个接口,并且有它的实现类,那么Hilt也可以注入生成该接口。
假设你想从网络上获取天气预报数据。那么在你的数据库中使用Suspend函数就会类似于下面的情况。...让我们看看从数据库中获取实时更新。...,map函数中的所有数据转换将在Flow collect的scope内以异步方式完成。...让我们在ViewModel中获取主题更新。...只需使用catch操作符来捕捉下行流中的任何错误。
本文是介绍 Android 协程系列中的第二部分,这篇文章主要会介绍如何使用协程来处理任务,并且能在任务开始执行后保持对它的追踪。...当将协程同 Android 架构组件 (Android Architecture Components) 集成起来时,您往往会需要在 ViewModel 中启动协程。...所以,当您需要将一个协程同 ViewModel 的生命周期保持一致时,使用 viewModelScope 来从常规函数切换到协程中。...当然,在真实的 Android 开发中最好别这么做,太浪费资源了。 这段代码中,我们在 coroutineScope 构造器中使用 launch 启动了一千个协程,您可以看到这一切是如何联系到一起的。...使用结构化并发 在这篇文章中,我介绍了结构化并发,并展示了如何让我们的代码配合 Android 中的 ViewModel 来避免出现任务泄漏。
前言 百度翻译的单词发音获取比较简单。不需要带什么签名、token,cookie等等,方便我们获取信息。...network分析 从百度翻译官网中可以发现,向https://fanyi.baidu.com/gettts可以获取MP3音频文件 http请求 请求URL:https://fanyi.baidu.com...第三个单词是获取单词读音的速度。3就是默认的,3就可以。 第四个单词默认就行,这个不用管。...举例:获取到单词发音后,用mediaPlayer播放 先上代码: private String search_text="petroleum"//petroleum替换成你想要查的单词发音 //获取百度翻译单词发音...mediaPlayer比较强大,原生就支持网络源播放音频,使用MediaPlayer.create(v.getContext(), Uri.parse(uk)).start();即可播放 再通过mediaPlayer.start
在这篇文章中,我将分享如何使用 Jetpack Compose、Material3 结合 MVVM 架构设计一个模块化的Android应用。...代码复用:通用组件可以封装成独立模块,方便在项目中复用。 提高开发效率:不同团队可以并行开发各自负责的模块,减少相互依赖。 易维护:当某个模块出现问题时,定位和修复很方便。...{ repository.addWish(wish) } } fun deleteWish(wish: Wish) { viewModelScope.launch...在每个页面中,通过 ViewModel 获取数据,渲染相应的 UI。...导航逻辑放置在 MainScreen 中。