为什么冻结应用程序时,使用Coroutine在Android

bbmckpt7  于 2023-01-19  发布在  Android
关注(0)|答案(2)|浏览(135)

在我的应用程序中,我希望每60秒调用一次API,为此我希望使用Coroutines
我写下面的代码,但一段时间后,我的应用程序冻结,用户无法使用此应用程序!

我的密码:

private val coroutineScope = CoroutineScope(Dispatchers.Main)

...

private fun callLoopApi(): Job {
    return coroutineScope.launch {
        while (isActive) {
            delay(10000)
            presenter.callApi(5)
            Log.e("CoroutineLog", "CallApi")
        }
    }
}

ApiCall代码:

override fun callApi(id: Int) {
        if (view.checkNetworkConnection()) {
            view.showLoader()
            disposable = ApiClientLive.getInstance().apisUseCase()
                .getTeamInfo(id)
                .applyIoScheduler()
                .subscribe({ response ->
                    view.hideLoader()
                    when (response.code()) {
                        in 200..202 -> {
                            response.body()?.let { itBody ->
                                itBody.data.let { itData ->
                                    itData?.results?.let { itResult ->
                                        view.loadTeamInfo(itResult)
                                    }
                                }
                            }
                        }

我想调用API每60秒,并更新我的用户界面。
我该如何解决这个问题?!

xqnpmsa8

xqnpmsa81#

你在主线程sample中启动它

private val coroutineScope = CoroutineScope(Dispatchers.IO)
private fun callLoopApi(): Job {
return coroutineScope.launch {
    while (isActive) {
        if (isRunLoopedApi) {
            presenter.callApi(5)
            delay(60000)
        }
    }
}
}

private val coroutineScope = CoroutineScope(Dispatchers.Main)
private fun callLoopApi(): Job {
return coroutineScope.launch(Dispatchers.Default + "BackgroundCoroutine") {
    while (isActive) {
        if (isRunLoopedApi) {
            presenter.callApi(5)
            delay(60000)
        }
    }
}
}
3pmvbmvn

3pmvbmvn2#

若要不在主线程上执行工作并避免UI冻结,请使用Dispatchers.IO;对于UI,请使用Dispatchers. Main。例如,您可以使用以下方法:

CoroutineScope(Dispatchers.IO).launch {
            //some work
            //work is finished
            CoroutineScope(Dispatchers.Main).launch {
                //do smth with result on UI, for example show result on UI
            }
        }

此外,如果在UI线程上调用delay(10000),则会冻结UI上的所有内容

相关问题