Android AsyncTask已废弃,求Play Store应用版本检测替代实现方案
AsyncTask替代实现方案
AsyncTask被官方废弃后,可根据项目所用语言选择以下两种替代方案实现版本检测逻辑:
方案1:Java场景 - ExecutorService + Handler
该方案通过线程池执行后台网络请求,通过Handler切换回主线程处理UI逻辑,替换原有AsyncTask的逻辑:
// 首先在Activity内初始化线程池和主线程Handler private final ExecutorService executor = Executors.newSingleThreadExecutor(); private final Handler mainHandler = new Handler(Looper.getMainLooper()); private WeakReference<Activity> activityRef; public void checkLatestVersion(boolean manualCheck) { activityRef = new WeakReference<>(YourActivity.this); executor.execute(() -> { String latestVersion = null; try { // 后台执行Jsoup爬取Play Store页面获取最新版本号的逻辑 latestVersion = Jsoup.connect("https://play.google.com/store/apps/details?id=" + getPackageName() + "&hl=en") .timeout(30000) .userAgent("Mozilla/5.0 (Windows; U; WindowsNT 5.1; en-US; rv1.8.1.6) Gecko/20070725 Firefox/2.0.0.6") .referrer("http://www.google.com") .get() .select(".hAyfc .htlgb") .get(7) .ownText(); } catch (Exception ignored) { } // 切回主线程处理UI逻辑 String finalLatestVersion = latestVersion; mainHandler.post(() -> { Activity activity = activityRef.get(); // 页面已销毁时直接返回,避免崩溃 if (activity == null || activity.isFinishing() || activity.isDestroyed()) { return; } String currentVersion = getCurrentVersion(); if(finalLatestVersion != null && !currentVersion.equals(finalLatestVersion)){ final Dialog dialog = new Dialog(activity); dialog.setContentView(R.layout.custom_warning_dialog); dialog.setCancelable(false); Button tryAgain = dialog.findViewById(R.id.bt_positive); Button settings = dialog.findViewById(R.id.bt_negative); tryAgain.setOnClickListener(v -> { activity.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id="+activity.getPackageName()))); dialog.dismiss(); }); settings.setOnClickListener(v -> { activity.finish(); }); dialog.show(); }else { if (manualCheck) { Toast.makeText(activity, "当前已是最新版本", Toast.LENGTH_SHORT).show(); } } }); }); } // 页面销毁时关闭线程池,避免内存泄漏 @Override protected void onDestroy() { super.onDestroy(); executor.shutdown(); }
方案2:Kotlin场景 - 协程
Kotlin项目直接使用协程实现更简洁,无需额外处理线程切换逻辑:
// 需提前引入协程相关依赖,通过lifecycleScope绑定页面生命周期 private fun checkLatestVersion(manualCheck: Boolean) = lifecycleScope.launch { var latestVersion: String? = null // IO线程执行爬取逻辑 withContext(Dispatchers.IO) { latestVersion = try { Jsoup.connect("https://play.google.com/store/apps/details?id=${packageName}&hl=en") .timeout(30000) .userAgent("Mozilla/5.0 (Windows; U; WindowsNT 5.1; en-US; rv1.8.1.6) Gecko/20070725 Firefox/2.0.0.6") .referrer("http://www.google.com") .get() .select(".hAyfc .htlgb") .get(7) .ownText() } catch (e: Exception) { null } } // 主线程处理UI latestVersion?.let { version -> val currentVersion = getCurrentVersion() if (currentVersion != version) { val dialog = Dialog(this@YourActivity) dialog.setContentView(R.layout.custom_warning_dialog) dialog.setCancelable(false) dialog.findViewById<Button>(R.id.bt_positive).setOnClickListener { startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=${packageName}"))) dialog.dismiss() } dialog.findViewById<Button>(R.id.bt_negative).setOnClickListener { finish() } dialog.show() } else { if (manualCheck) { Toast.makeText(this@YourActivity, "当前已是最新版本", Toast.LENGTH_SHORT).show() } } } }
注意事项
- 原有代码中依赖的Play Store页面CSS选择器可能随Google页面结构更新失效,建议优先使用Google官方的应用内更新API实现版本检测,稳定性更高。
- 网络请求相关操作需要提前申请
INTERNET权限。 - 使用ExecutorService时务必在页面销毁时关闭线程池,使用协程时通过lifecycleScope绑定页面生命周期,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Clinton Canarias
相关产品推荐
相关产品推荐

