改造成功后,协程问题将数据插入房间数据库

维贾贾德

我正在使用Retrofit从API服务器获取新闻记录,如果成功,则它将使用insertAll作为下面的代码将数据写入会议室数据库,但是此代码会产生如下错误,因为可能会锁定而无法访问主线程上的数据库用户界面很长一段时间

我尝试将Coroutine与withContext(Dispatchers.IO)一起使用,但我认为这是不正确的,谢谢您的任何帮助

suspend fun refreshNews(queryString: String="", page: Int = 1) {
  withContext(Dispatchers.IO) {
    RetrofitClient.instance.getAllNews(buatObjectNewsQuery(queryString), page)
        .enqueue(object : Callback<NewsGetAllResponse> {
            override fun onFailure(call: Call<NewsGetAllResponse>, t: Throwable) {
                Timber.tag(TAG).i("sorry network error")
            }

            override fun onResponse(
                call: Call<NewsGetAllResponse>,
                response: Response<NewsGetAllResponse>
            ) {
                val newslist = response.body()?.asDatabaseModel()
                if (newslist != null) {
                    database.databaseNewsDao.insertAll(*newslist)
                    Timber.tag(TAG).i("dalam refresh jumlah data ${newslist.size}")
                }
            }


        })

  }
}
多米尼克·菲舍尔(Dominic Fischer)

您的代码应看起来像这样。suspendCoroutine用来隔离回调代码,以便类似withContext(Dispatchers.IO)您期望的东西

suspend fun refreshNews(queryString: String="", page: Int = 1) {
    val call = RetrofitClient.instance.getAllNews(buatObjectNewsQuery(queryString), page)
    val response = suspendCoroutine { cont ->
        call.enqueue(object : Callback<NewsGetAllResponse> {
            override fun onFailure(call: Call<NewsGetAllResponse>, t: Throwable) {
                cont.resumeWithException(t)
            }

            override fun onResponse(
                call: Call<NewsGetAllResponse>,
                response: Response<NewsGetAllResponse>
            ) {
                const.resume(response)
            }
        })
    }

    val newslist = response.body()?.asDatabaseModel()
    if (newslist != null) {
        withContext(Dispatchers.IO) {
            database.databaseNewsDao.insertAll(*newslist)
            Timber.tag(TAG).i("dalam refresh jumlah data ${newslist.size}")
        }
    }
}

编辑:

理想情况下,您想为此创建扩展功能,因此阅读起来看起来并不那么吓人。

suspend fun <T> Call<T>.awaitResponse(): Response<T> {
    return suspendCancellableCoroutine { continuation ->
        continuation.invokeOnCancellation {
            cancel()
        }
        enqueue(object : Callback<T> {
            override fun onResponse(call: Call<T>, response: Response<T>) {
                continuation.resume(response)
            }

            override fun onFailure(call: Call<T>, t: Throwable) {
                continuation.resumeWithException(t)
            }
        })
    }
}

suspend fun refreshNews(queryString: String="", page: Int = 1) {
    val call = RetrofitClient.instance.getAllNews(buatObjectNewsQuery(queryString), page)
    val response = call.awaitResponse()

    val newslist = response.body()?.asDatabaseModel()
    if (newslist != null) {
        withContext(Dispatchers.IO) {
            database.databaseNewsDao.insertAll(*newslist)
            Timber.tag(TAG).i("dalam refresh jumlah data ${newslist.size}")
        }
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

房间数据库。插入成功,但未找到数据

来自分类Dev

插入数据后房间数据库表还是空的

来自分类Dev

数据在房间数据库显示,从服务器中删除后,即使

来自分类Dev

显示错误,而在房间数据库中插入用户

来自分类常见问题

加入房间数据库收藏夹

来自分类Dev

从LiveData填充微调器(房间数据库)

来自分类Dev

使用 kotlin 的房间数据库

来自分类Dev

实现房间数据库 (Android)

来自分类Dev

房间数据库多列子查询

来自分类Dev

添加到房间数据库

来自分类Dev

从房间数据库中删除实体

来自分类Dev

多模块项目中的房间数据库

来自分类Dev

将最喜欢的图标添加到房间数据库

来自分类Dev

如何将sqlite中的现有表迁移到android中的房间数据库

来自分类Dev

从房间数据库中获取当前周和月的数据

来自分类Dev

如何从房间数据库中获取多个计数?

来自分类Dev

房间数据库中GROUP BY语句的返回类型

来自分类Dev

如何在房间数据库中触发两个查询

来自分类Dev

如何在房间数据库中将列名作为参数传递?

来自分类Dev

即使房间数是最大数,该值仍存储在数据库中

来自分类Dev

在房间数据库中使用列表存储模型对象

来自分类Dev

房间数据库,用列表构建和查询实体

来自分类Dev

房间数据库中的自定义对象数组

来自分类Dev

Android Studio:如何让房间数据库自动生成记录 ID?

来自分类Dev

房间数据库不考虑类型转换器

来自分类Dev

RxJava toMultiMap 不适用于房间数据库查询

来自分类Dev

如何在房间数据库中加入多个表

来自分类Dev

android - 房间数据库未创建架构组件

来自分类Dev

如何仅按日期和月份过滤房间数据库中的数据并忽略年份

Related 相关文章

热门标签

归档