android-fragments IO线程进程Kotlin协程完成后,在main threa中运行代码

u7up0aaq  于 2022-11-13  发布在  Android
关注(0)|答案(2)|浏览(100)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

  lifecycleScope.launch(Dispatchers.Main) {
            networkviewModel.productist.collectLatest {
                when (it) {
                    Resource.Empty -> {
                        Log.e("product", "" + "empty")
                    }
                    is Resource.Failure -> {
                        Log.e("product", "" + "failure")
                    }
                    Resource.Loading -> {

                    }
                    is Resource.Success -> {
                        val response = it.value
                        Log.e("test","success response")
                        val products: List<Products> = response.data
                        val variants: List<Variants> = response.data.map { it.variants }.flatten()
                        lifecycleScope.launch(Dispatchers.IO) {
                            productRoom.insertProducts(products)
                            productRoom.insertVariants(variants)
                            val subcategoryid = SubCategoryList(response.data[0].subcategory_id!!.toInt())
                            productRoom.insertSubCat(subcategoryid)
                        }
                        subcat_id = response.data[0].subcategory_id!!.toInt()
                        roomviewModel.productFlow.collectLatest{
                            Log.e("test","flow success from network room")
                            //    Log.e("test",it.toString())
                            LoadingUtils.hideDialog()
                            proadapter.setMutableArraylist(it)
                            proadapter.notifyDataSetChanged()
                        }
                    }
                }
            }
        }
}

我得到了致命异常错误:主要流程:网站名称:13125错误代码:索引:0,大小:0
因为在Resource.Success -〉collect完成之前调用了IO线程进程
我希望完成IO线程,然后从空间中收集值

khbbv19g

khbbv19g1#

在收集之前尝试使用withContext(Dispatchers.IO),它将被挂起,直到所有操作完成:

withContext(Dispatchers.IO) {                
    productRoom.insertProducts(products)
    productRoom.insertVariants(variants)
    val subcategoryid = SubCategoryList(response.data[0].subcategory_id!!.toInt())
    productRoom.insertSubCat(subcategoryid)
}
// ... collecting code

顺便说一句,你不需要使用Dispatchers.Main来启动主协程,默认情况下,lifecycleScopeDispatchers.Main上下文中工作,所以你只需要写:

lifecycleScope.launch {
    // ...
}
cxfofazt

cxfofazt2#

崩溃发生在这行代码中

val subcategoryid = SubCategoryList(response.data[0].subcategory_id!!.toInt())

请尝试将其更改为

val subcategoryid = SubCategoryList(response.data[0]?.subcategory_id?.toInt())?:0

相关问题