Ten*_*r04 5 android kotlin kotlin-coroutines
我知道建议将 ViewModel 与我们的 Activity 一起使用,因此我们可以使用它的viewModelScope
. 由于 ViewModel 比活动寿命更长,我们不必取消activity.onDestroy()
.
但是,有时您会遇到非常简单的 Activity。例如,它可以使用已安装的过滤包填充列表视图。您可以非常简单地使用委托为活动创建一个范围,并在onDestroy()
以下位置取消作业:
class MyActivity(): AppCompatActivity(), CoroutineScope by MainScope() {
private val listAdapter = MyAdapter()
override fun onCreate() {
super.onCreate()
setContentView(R.layout.my_activity)
recycler_view.apply {
layoutManager = LinearLayoutManager(this)
adapter = listAdapter
}
launch {
val packages = getOrgPackagesWithIcons()
adapter.apply {
data = packages
notifyDataSetChanged()
}
}
}
override fun onDestroy() {
super.onDestroy()
cancel() // CoroutineContext
}
private suspend fun getOrgPackagesWithIcons() = withContext(Dispatchers.Default) {
var toNextYield = 20
packageManager.getInstalledPackages(0)
.filter { it.packageName.startsWith("org")
.take(100)
.map {
if (--toNextYield == 0) { // Make it cancellable
toNextYield = 20
yield()
}
MyPackageData(
it.applicationInfo.loadLabel(packageManager).toString(),
it.packageName,
it.applicationInfo.loadIcon(packageManager)
)
}
}
}
Run Code Online (Sandbox Code Playgroud)
对于这种情况,ViewModel 感觉有点矫枉过正。它只是抽象 PackageManager 的另一层,它本身就是一个视图模型。
上面的代码可以很容易地在后台组装数据。问题是当屏幕旋转时,或者在其他配置更改期间,协程被取消并重新启动。对于像这样的非常简单的活动,是否有通过配置更改来保持 CoroutineScope 活动的干净方法?
onRetainNonConfigurationInstance()
已弃用。我想我们可以把它放在一个 Fragment 中并使用retainInstance = true
,但是为这样一个简单的 Activity 引入一个 Fragment 层也感觉有点矫枉过正。
也许有一种方法可以创建一个空的 ViewModel 实现,以便我们可以借用它的范围?
对于这样的情况,ViewModel 感觉有点大材小用。
我会反对,但仍然建议这将是一个很好的用例AndroidViewModel
。
我相信仅仅Activity
因为它可以访问PackageManager
. 应该Activity
只负责显示列表。
使用AndroidViewModel
使您可以访问实例Context
并在实例viewModelScope
内进行访问ViewModel
。
归档时间: |
|
查看次数: |
687 次 |
最近记录: |