Android 调用RESTAPI的协同路由->致命异常:main

Android 调用RESTAPI的协同路由->致命异常:main,android,kotlin,kotlin-coroutines,Android,Kotlin,Kotlin Coroutines,我需要从REST API获取一些数据,当我连接4G或wifi时一切正常,但当我处于飞行模式时,应用程序崩溃:E/AndroidRuntime:FATAL EXCEPTION:main 在此之前,我有一个日志不是一个错误说:跳过1013帧!应用程序可能在其主线程上做了太多工作 因此,我假设在没有网络的情况下获取API会使应用程序崩溃,因为它在主线程中运行。但我使用的是协同程序,对我来说,我做得很好: 视图模型 存储库 服务 因此,整个链条是: ViewModel->与Dispatchers.Mai

我需要从REST API获取一些数据,当我连接4G或wifi时一切正常,但当我处于飞行模式时,应用程序崩溃:E/AndroidRuntime:FATAL EXCEPTION:main

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

因此,我假设在没有网络的情况下获取API会使应用程序崩溃,因为它在主线程中运行。但我使用的是协同程序,对我来说,我做得很好:

视图模型

存储库

服务

因此,整个链条是:

ViewModel->与Dispatchers.Main协同工作

调用Repository->suspend函数,启动与Dispatchers.IO的协同程序

通过对象网络调用Service->,我得到一个带有getPlaylist的翻新实例,该实例返回一个延迟的,对该方法的调用在存储库中,带有一个wait


我做错了什么?

您的API调用正在引发异常,因为没有网络连接,很可能是未知的异常


用try-catch包装它并处理异常。

您的API调用正在引发异常,因为没有网络连接很可能是未知的异常

用try-catch包装它并处理异常。

CoroutineExceptionHandler可能是一个解决方案

当您打开飞行模式时,进行网络呼叫的协同路由将抛出异常。 在你的情况下,你可以这样做

    val handler = CoroutineExceptionHandler { _, exception -> 
            //Handle your exception
        }
    init {
        viewModelScope.launch(handler) {
            videosRepository.refreshVideos()
        }
    }
CoroutineExceptionHandler可能是一个解决方案

当您打开飞行模式时,进行网络呼叫的协同路由将抛出异常。 在你的情况下,你可以这样做

    val handler = CoroutineExceptionHandler { _, exception -> 
            //Handle your exception
        }
    init {
        viewModelScope.launch(handler) {
            videosRepository.refreshVideos()
        }
    }

是的,这就成功了,谢谢你。问题是,我本可以处理异常,但我在日志中没有找到网络异常…是的,这就成功了,谢谢。问题是,我本可以处理异常,但我在日志中没有找到网络异常……我会看一看,但为了简单起见,我使用了一个简单的try-catch。谢谢!这更整洁!我会看一看,但为了简单起见,我使用了一个简单的try-catch。谢谢!这更整洁!
/**
 * 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)
}
    val handler = CoroutineExceptionHandler { _, exception -> 
            //Handle your exception
        }
    init {
        viewModelScope.launch(handler) {
            videosRepository.refreshVideos()
        }
    }