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

Android WebView需求:持续等待直至目标URL可用

实现WebView持续等待/刷新直至目标URL可访问的方案

核心思路

先通过轻量网络请求验证目标URL的可达性,成功后再让WebView加载;若不可达,则定时重试,直到URL可用为止。同时结合WebView的加载失败回调,应对检测成功但加载时再次不可用的情况。

具体实现步骤

1. 添加必要权限

在AndroidManifest.xml中添加网络权限:

<uses-permission android:name="android.permission.INTERNET" />
<!-- 若目标URL为HTTP(Android 9+),需添加以下配置 -->
<application
    ...
    android:usesCleartextTraffic="true">
    ...
</application>

2. 封装URL可达性检测方法

使用轻量的HEAD请求验证URL是否可访问(比GET请求更节省资源),示例用OkHttp实现(需在build.gradle中添加依赖:implementation 'com.squareup.okhttp3:okhttp:4.12.0'):

private fun isUrlReachable(url: String): Boolean {
    return try {
        val client = OkHttpClient.Builder()
            .callTimeout(5, TimeUnit.SECONDS) // 设置超时时间
            .build()
        val request = Request.Builder().url(url).head().build()
        val response = client.newCall(request).execute()
        response.isSuccessful // 响应码200-399视为成功
    } catch (e: Exception) {
        false // 异常则判定为不可达
    }
}

3. 实现定时重试与WebView加载逻辑

用Coroutine(Kotlin)实现异步重试逻辑,避免阻塞主线程:

import android.os.Bundle
import android.webkit.WebView
import android.webkit.WebViewClient
import androidx.appcompat.app.AppCompatActivity
import kotlinx.coroutines.*
import okhttp3.OkHttpClient
import okhttp3.Request
import java.util.concurrent.TimeUnit

class MainActivity : AppCompatActivity() {
    private val targetUrl = "你的目标流式传输URL"
    private val retryDelay = 3000L // 3秒重试一次,可按需调整
    private var retryJob: Job? = null
    private lateinit var webView: WebView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        webView = findViewById(R.id.webView)
        setupWebView()
        startUrlCheckAndLoad()
    }

    private fun setupWebView() {
        webView.settings.javaScriptEnabled = true
        webView.webViewClient = object : WebViewClient() {
            // WebView加载失败时,重新触发检测重试
            override fun onReceivedError(
                view: WebView?,
                errorCode: Int,
                description: String?,
                failingUrl: String?
            ) {
                startUrlCheckAndLoad()
            }
        }
    }

    private fun startUrlCheckAndLoad() {
        // 取消之前的重试任务,避免重复执行
        retryJob?.cancel()
        retryJob = CoroutineScope(Dispatchers.IO).launch {
            while (isActive) {
                if (isUrlReachable(targetUrl)) {
                    // 检测成功,切换到主线程加载URL
                    withContext(Dispatchers.Main) {
                        webView.loadUrl(targetUrl)
                        retryJob?.cancel() // 停止重试
                    }
                    break
                } else {
                    delay(retryDelay)
                }
            }
        }
    }

    // 页面销毁时取消任务,防止内存泄漏
    override fun onDestroy() {
        super.onDestroy()
        retryJob?.cancel()
        webView.destroy()
    }
}

4. 关键注意事项

  • 线程安全:网络检测必须在子线程执行,不能阻塞主线程(示例用Coroutine的IO调度器)。
  • 资源清理:页面销毁时务必取消重试任务,避免内存泄漏。
  • 重试频率:合理设置重试间隔(建议3-5秒),过于频繁会增加设备功耗与网络负载。
  • 用户体验:可添加ProgressBar或加载提示文本,让用户知晓当前状态。
  • 异常处理:网络请求需捕获所有异常(如超时、无网络等),避免崩溃。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 10:57:31