互联网关闭时 Webview 失败

Webview failure when internet is off

我有一个基于 Web 的应用程序,其中 url 在应用程序启动时加载。

我正在尝试处理一个问题

Internet of WiFi is turned off when resources are loading( resources are loaded in async format).

我正在使用 WebViewClientonReceivedError(WebView view, int errorCode, String description, String failingUrl) 来检查 url 故障。我也试过 onReceivedError(WebView view, WebResourceRequest request, WebResourceError error)

但是在加载资源期间关闭 WiFi 互联网时,我没有收到任何失败回调。

试试这个:

您可以设置网络检查的条件,然后根据需要构建您的逻辑

WebView mWebView;
NetworkInfo networkInfoWifi = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE).getNetworkInfo(ConnectivityManager.TYPE_WIFI);

mWebView.setWebViewClient(mWebClient);

WebViewClient mWebClient = new WebViewClient(){

    @Override
    public boolean shouldOverrideUrlLoading(WebView  view, String  url){
        return true;
    }

    @Override
    public void onLoadResource(WebView  view, String  url){
        if (networkInfoWifi.isConnected()) {
            //Take action
        }
    }

}

希望这能奏效!

为网络变化创建接收器你可以检测网络是关闭还是打开如下所示你可以将本地广播发送到你的 activity -

public class NetworkChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, final Intent intent) {

    ConnectivityManager connectivityManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE );
      NetworkInfo activeNetInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
      boolean isConnected = activeNetInfo != null && activeNetInfo.isConnectedOrConnecting();   
      if (isConnected)       
          Log.i("NET", "Connected" + isConnected);   
      else 
          Log.i("NET", "Not Connected" + isConnected);
    }
}

menifest.xml 文件中添加以下行

 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
 <uses-permission android:name="android.permission.INTERNET" />
 <receiver
        android:name="NetworkChangeReceiver"
        android:label="NetworkChangeReceiver" >
        <intent-filter>
            <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
            <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
        </intent-filter>
    </receiver>

这可能不是最有效的方法,但在这种情况下它符合我的目的。我正在使用 ping 服务(目前为 8.8.8.8)、JS 回调和 ConnectivityManager NetworkCallback 来实现这一点。

我们正在使用一个 JS 来检查是否所有的资源都没有加载,它会给出错误,'no' 或 'yes'。错误 & 'no' 表示 html 未完全加载。

ConnectivityManager NetworkCallback 用于在用户处于“设置”屏幕时了解同一 WiFi 的互联网何时恢复,因为如果互联网恢复,我们需要将用户重定向回应用程序。 onLinkPropertiesChanged 将在这种情况下调用,我们使用 Ping 服务检查互联网是否可用。

注册网络回调

connectivityManager =
                    (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

            NetworkRequest.Builder builder = new NetworkRequest.Builder();
            builder.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
            builder.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR);
            builder.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
            builder.addTransportType(NetworkCapabilities.TRANSPORT_VPN);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                connectivityManager.registerNetworkCallback(builder.build(), networkCallback);
            }

networkCallback

ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() {

        @RequiresApi(api = Build.VERSION_CODES.M)
        @Override
        public void onAvailable(Network network) {
            // network available
            networkCheck(network);
        }

        @Override
        public void onLinkPropertiesChanged(Network network, LinkProperties linkProperties) {
            super.onLinkPropertiesChanged(network, linkProperties);
            networkCheck(network);
        }

        @Override
        public void onLost(Network network) {
            // network unavailable
            onDisconnected();
        }
    };

networkCheck 检查互联网是否可用。也许这一步可以忽略,写 i 虽然 NET_CAPABILITY_VALIDATED 会检查互联网。但它在某些情况下会失败。

private void networkCheck(Network network) {
        ConnectivityManager cm = (ConnectivityManager) getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo info = cm.getNetworkInfo(network);
        boolean isConnected = (info != null && info.isConnectedOrConnecting());

        if (!isConnected) {
            onDisconnected();
            return;
        }
        NetworkCapabilities nc = cm.getNetworkCapabilities(network);
        if (nc == null || !nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED) || !checkPingService()) {
            onDisconnected();
            return;
        }
        onConnected();
    }

checkPingService 检查互联网是否可用

private boolean checkPingService() {
        try {
            Process p1 = java.lang.Runtime.getRuntime().exec("ping -c 1 8.8.8.8");
            int returnVal = p1.waitFor();
            return (returnVal == 0);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

到目前为止,这在我们测试的所有场景中都有效。如有任何疑问,请随时发表评论。