在 Intent Service 中使用 Retrofit 2 class

Using Retrofit 2 in Intent Service class

我正在尝试从服务器获取数据并将其同步到应用程序的后台。我在 Intent Service class 中使用 AsyncTask 完成了它,但现在我想使用 Retrofit 进行网络调用。因此,我使用改造从服务器获取数据,但是当我将它们保存在本地数据库中时,主线程冻结了,只有在该过程完成后我才能在主线程上做一些事情。为什么会这样?

我尝试了 synchronus 和 Asynchronus 的改造请求,但问题仍然存在。这是我到目前为止尝试过的..

//calling company api in synchronus way

    try {
        val responseCompany = apiService.company(page, headers, bodyModel).execute()
        Log.e("onResponse", "Company Response Code: ${responseCompany.code()}")
        Log.e("onResponse", "Company Response Body: ${Gson().toJson(responseCompany.body())}")

        if (responseCompany.isSuccessful) {
            val response = responseCompany.body()

            //delete company data
            if (response?.delete?.data?.size!! > 0) {
                for (i in response.delete.data.indices) {

                    val delete = response.delete.data[i]
                    Log.e(tag, "Delete Company data $i: ${delete.company_id}")
                    dbAdapter.open()
                    dbAdapter.Delete_COMPANY_NAME(delete.company_id)
                    dbAdapter.close()
                }
            }

            //insert company data
            if (response.insert.data.isNotEmpty()) {
                for (i in response.insert.data.indices) {
                    val insert = response.insert.data[i]
                    Log.e(tag, "Insert company data $i: ${insert.company_id}")
                    dbAdapter.open()
                    dbAdapter.Insert_COMPANY_NAME(insert.company_id.toString(), insert.company_name)
                    dbAdapter.close()
                }
            }

            //update company data
            if (response.update.data.isNotEmpty()) {
                for (i in response.update.data.indices) {
                    val update = response.update.data[i]
                    Log.e(tag, "Update Company data $i: ${update.company_id}")
                    dbAdapter.open()
                    dbAdapter.Update_COMPANY_NAME(update.company_id.toString(), update.company_name)
                    dbAdapter.close()
                }
            }

            val totalPage = largest(response.delete.meta.pagination.total_pages, response.insert.meta.pagination.total_pages, response.update.meta.pagination.total_pages)


                    if (page < totalPage) {
                        prefManager.pageNumber = page + 1
                        bodyModel.date = lastAdUpdate2
                        bodyModel.limit = 500
                        companyData(bodyModel)
                    } else {
                        prefManager.T_COMPANY_NAME = currentTime
                        prefManager.PAGE_NUMBER = 1
                        prefManager.TOTAL_PAGE = 1
                        prefManager.pageNumber = 1
                        prefManager.FIRST = "1"
                        pagenumber = prefManager.PAGE_NUMBER

                        Handler().postDelayed({
                            bodyModel.limit = 100
                            bodyModel.date = lastAdUpdate3
                            generics(bodyModel)
                        }, 1000)
                    }
        } else {
            prefManager.dbUpdateStatus = false
            Log.i("dataNotInsert", "data Not Insert")
        }

    } catch (e: Exception) {
        Log.e("Exception", "Company: ${e.localizedMessage}")
        e.printStackTrace()
    }

N.B:我在 Intent 服务中进行了网络调用(改装请求)class..

非常感谢任何帮助。谢谢

这个问题实际上是通过将 Intent Service 替换为 Work Manager 来解决的。并使用 Kotlin 协程

如果您想坚持使用 Intent Service 而不是使用 WorkManager。只需使用 AsyncTask 包装您的网络调用即可解决问题