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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 06:09:03