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

Android WebView实现主域名连通则加载url1,否则加载url2的Java方案

Android WebView 多链接 fallback 实现方案

方案一:预检测URL连通性后加载

先异步检测主链接(url1)的连通性,成功则加载url1,失败则加载备用链接(url2)。推荐用OkHttp做网络检测,比HttpURLConnection更简洁高效。

依赖配置(使用OkHttp时)

在Module级别build.gradle添加依赖:

implementation 'com.squareup.okhttp3:okhttp:4.12.0'

核心实现代码

import android.os.Bundle;
import android.webkit.WebView;
import androidx.appcompat.app.AppCompatActivity;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;

public class MainActivity extends AppCompatActivity {
    private WebView webView;
    private static final String URL_MAIN = "https://your-main-domain.com";
    private static final String URL_BACKUP = "https://your-backup-domain.com";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        webView = findViewById(R.id.webview);
        webView.getSettings().setJavaScriptEnabled(true);

        // 异步检测主链接连通性
        checkUrlConnectivity(URL_MAIN, new ConnectivityCallback() {
            @Override
            public void onSuccess() {
                runOnUiThread(() -> webView.loadUrl(URL_MAIN));
            }

            @Override
            public void onFailure() {
                runOnUiThread(() -> webView.loadUrl(URL_BACKUP));
            }
        });
    }

    private void checkUrlConnectivity(String url, ConnectivityCallback callback) {
        OkHttpClient client = new OkHttpClient.Builder()
                .callTimeout(5, java.util.concurrent.TimeUnit.SECONDS) // 设置超时时间
                .build();

        Request request = new Request.Builder()
                .head() // 仅发送HEAD请求,减少数据传输量
                .url(url)
                .build();

        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                callback.onFailure();
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                if (response.isSuccessful()) {
                    callback.onSuccess();
                } else {
                    callback.onFailure();
                }
                response.close();
            }
        });
    }

    // 自定义连通性检测回调接口
    private interface ConnectivityCallback {
        void onSuccess();
        void onFailure();
    }
}

方案二:通过WebView错误回调切换链接

直接加载主链接,当WebView捕获到net::ERR_CONNECTION_RESET错误时,自动切换到备用链接。这种方式无需额外网络请求,直接利用WebView的加载反馈。

核心实现代码

import android.os.Bundle;
import android.webkit.WebResourceError;
import android.webkit.WebResourceRequest;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
    private WebView webView;
    private static final String URL_MAIN = "https://your-main-domain.com";
    private static final String URL_BACKUP = "https://your-backup-domain.com";
    private boolean hasSwitchedBackup = false; // 防止重复切换导致循环加载

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        webView = findViewById(R.id.webview);
        webView.getSettings().setJavaScriptEnabled(true);

        webView.setWebViewClient(new WebViewClient() {
            // 兼容API 23及以上版本
            @Override
            public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
                super.onReceivedError(view, request, error);
                // net::ERR_CONNECTION_RESET对应错误码为-101
                if (error.getErrorCode() == -101 && !hasSwitchedBackup) {
                    hasSwitchedBackup = true;
                    view.loadUrl(URL_BACKUP);
                }
            }

            // 兼容API 23以下版本
            @Override
            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
                super.onReceivedError(view, errorCode, description, failingUrl);
                if (errorCode == -101 && !hasSwitchedBackup) {
                    hasSwitchedBackup = true;
                    view.loadUrl(URL_BACKUP);
                }
            }
        });

        // 初始加载主链接
        webView.loadUrl(URL_MAIN);
    }
}

补充说明

  • 方案一优势:提前判断连通性,避免WebView先加载主链接再跳转的页面闪烁,但需要额外发起网络请求。
  • 方案二优势:实现简洁,直接利用WebView自身的错误回调,适合不需要提前检测的场景。
  • 必须添加网络权限:在AndroidManifest.xml中加入<uses-permission android:name="android.permission.INTERNET" />

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 04:37:29