如何同步使用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
相关产品推荐
相关产品推荐

