You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何同步使用Android AppUpdateManager的appUpdateInfoTask?求协程实现方案

用Kotlin协程改造Play商店更新检测函数

你的问题核心在于原函数里的addOnSuccessListener是异步执行的,函数会在回调触发前就返回初始值false,自然得不到正确结果。用Kotlin协程可以实现同步风格的异步调用,既避免ANR,又能在拿到结果后再执行后续逻辑。

步骤1:添加协程依赖

确保项目中引入Google Task的协程扩展库,让Task可以和协程兼容:

implementation "org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.7.3"

(版本可根据项目使用的协程版本调整)

步骤2:改造检测函数为挂起函数

将原函数改为协程挂起函数,用await()替代回调逻辑:

import com.google.android.play.core.appupdate.AppUpdateManagerFactory
import com.google.android.play.core.install.model.UpdateAvailability
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext

suspend fun isAppUpdateAvailable(): Boolean {
    val appUpdateManager = AppUpdateManagerFactory.create(applicationContext)
    // 用await()挂起协程,直到Task执行完成并返回结果
    val appUpdateInfo = withContext(Dispatchers.IO) {
        appUpdateManager.appUpdateInfo.await()
    }
    return appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE
}

withContext(Dispatchers.IO)用于避免在主线程执行IO相关操作,虽然Play的Task内部可能已处理线程,但显式指定更稳妥。

步骤3:在Activity中协程内调用

在MainActivity.onCreate()中,用lifecycleScope启动协程调用检测函数,拿到结果后再处理页面跳转:

import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.launch
import android.content.Intent

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    lifecycleScope.launch {
        val hasUpdate = isAppUpdateAvailable()
        if (hasUpdate) {
            // 打开需要用户交互的确认页面
            startActivity(Intent(this@MainActivity, UpdateConfirmActivity::class.java))
        }
    }
}

lifecycleScope是Jetpack提供的与Activity生命周期绑定的协程作用域,会在Activity销毁时自动取消协程,避免内存泄漏。

注意事项

不要用CountDownLatch等方式阻塞主线程等待异步结果,这会直接导致ANR(应用无响应),协程是Android平台处理异步逻辑的最优解。

内容的提问来源于stack exchange,提问作者Bungles

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 18:22:36