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
相关产品推荐
相关产品推荐

