Gil*_*les 6 android kotlin kotlin-coroutines
我需要从 REST API 获取一些数据,当我连接 4G 或 wifi 时一切正常,但当我处于飞行模式时,应用程序崩溃并显示:“E/AndroidRuntime: FATAL EXCEPTION: main”
在此之前,我有一个日志(不是错误:“跳过了 1013 帧!应用程序可能在其主线程上做了太多工作。”)
所以我认为在没有网络的情况下获取 API 会导致应用程序崩溃,因为它在主线程中运行。但我正在使用协程,对我来说,我做得对:
视图模型
private val viewModelJob = SupervisorJob()
private val viewModelScope = CoroutineScope(viewModelJob + Dispatchers.Main)
init {
viewModelScope.launch {
videosRepository.refreshVideos()
}
}
Run Code Online (Sandbox Code Playgroud)
存储库
suspend fun refreshVideos() {
withContext(Dispatchers.IO) {
val playlist = Network.devbytes.getPlaylist().await()
//database.videoDao().insertAll(*playlist.asDatabaseModel())
}
}
Run Code Online (Sandbox Code Playgroud)
服务
/**
* A retrofit service to fetch a devbyte playlist.
*/
interface DevbyteService {
@GET("devbytes.json")
fun getPlaylist(): Deferred<NetworkVideoContainer>
}
/**
* Build the Moshi object that Retrofit will be using, making sure to add the Kotlin adapter for
* full Kotlin compatibility.
*/
private val moshi = Moshi.Builder()
.add(KotlinJsonAdapterFactory())
.build()
/**
* Main entry point for network access. Call like `Network.devbytes.getPlaylist()`
*/
object Network {
// Configure retrofit to parse JSON and use coroutines
private val retrofit = Retrofit.Builder()
.baseUrl("https://devbytes.udacity.com/")
.addConverterFactory(MoshiConverterFactory.create(moshi))
.addCallAdapterFactory(CoroutineCallAdapterFactory())
.build()
val devbytes: DevbyteService = retrofit.create(DevbyteService::class.java)
}
Run Code Online (Sandbox Code Playgroud)
所以完整的链条是:
ViewModel -> 与 Dispatchers.Main 协程
调用 Repository -> 挂起函数,使用 Dispatchers.IO 启动协程
通过对象 Network 调用 Service -> ,我得到一个带有 getPlaylist() 的改造实例,该实例返回 Deferred,并且对该方法的调用位于带有 wait() 的存储库中
我究竟做错了什么 ?
| 归档时间: |
|
| 查看次数: |
2449 次 |
| 最近记录: |