当前位置: 首页 > 知识库问答 >
问题:

Coroutines调用REST API->致命异常:main

连正信
2023-03-14

我需要从REST API中获取一些数据,当我连接4G或wifi时一切正常,但当我处于飞机模式时,应用程序崩溃:“E/AndroidRuntime:致命异常:Main”

在此之前,我有一个日志(不是错误地说:“跳过了1013帧!应用程序可能在其主线程上做了太多的工作。”)

所以我想在没有网络的情况下获取API会导致应用程序崩溃,因为它运行在主线程中。但我用的是等式,对我来说,我做得对:

视图模型

private val viewModelJob = SupervisorJob()
private val viewModelScope = CoroutineScope(viewModelJob + Dispatchers.Main)
init {
        viewModelScope.launch {
            videosRepository.refreshVideos()
        }
    }

存储库

suspend fun refreshVideos() {
        withContext(Dispatchers.IO) {
            val playlist = Network.devbytes.getPlaylist().await()
            //database.videoDao().insertAll(*playlist.asDatabaseModel())
        }
    }

服务

/**
 * 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)
}

所以完整的链条是:

ViewModel->与dispatchers.main协同工作

调用repository->suspend函数,该函数用dispatchers.io启动一个coroutine

通过object Network调用service->时,我得到一个带有getPlaylist()的改型实例,该实例返回一个Deferred,并且对该方法的调用在存储库中带有一个await()

我做错了什么?

共有1个答案

蒯硕
2023-03-14

您的API调用引发异常,因为没有网络连接(很可能是UnknownHostException)。

将其包装在try-catch中并处理异常。

 类似资料:
  • 我是Android的初学者。我正在开发一个应用程序。我收到这个问题,我不知道怎么做。 这是我在logcat中收到的信息:

  • 错误为: 11-17 06:23:34.603 354 0-3540/com.example.ruiru.salestracker E/AndroidRuntime:致命异常:主进程:com.example.ruiru.salestracker,pid:3540 java.lang.RuntimeException:无法启动activity ComponentInfo{com.example.ru

  • 在我的应用程序里。我正试图使用Kotlin Coroutines发送网络请求。我分析了一些情况下的响应和抛出异常。下面是代码: 此拦截异常。 logcat中的此异常消息 06-03 17:18:01.012 237 96-24010/ru.mtsbank.dbosme e/androidruntime:致命异常:OkHttp调度程序流程:ru.mtsbank.dbosme,pid:23796 ja

  • 请在这方面需要帮助。当我试图在模拟器上运行我的应用程序时,我的Logcat中出现了这些错误,我的UI崩溃了 logcat错误

  • 我的用它的作用域启动coroutine 我的只处理一些逻辑,在本例中是某种验证器 然后我的只处理网络层/本地层 以下是我得到的错误日志: 错误直接指向显式的语句。