Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android internet关闭时Webview失败_Android_Webview - Fatal编程技术网

Android internet关闭时Webview失败

Android internet关闭时Webview失败,android,webview,Android,Webview,我有一个基于web的应用程序,在应用程序启动时加载url。 我正在努力处理一个问题 加载资源时,WiFi互联网将关闭(资源以异步格式加载) 我正在使用WebViewClient的onReceivedError(WebView视图,int-errorCode,String description,String failingUrl)检查url失败。我还尝试了接收错误(WebView视图、WebResourceRequest请求、WebResourceError错误) 但在资源加载期间,当WiFi网

我有一个基于web的应用程序,在应用程序启动时加载url。 我正在努力处理一个问题

加载资源时,WiFi互联网将关闭(资源以异步格式加载)

我正在使用
WebViewClient
onReceivedError(WebView视图,int-errorCode,String description,String failingUrl)
检查url失败。我还尝试了接收错误(WebView视图、WebResourceRequest请求、WebResourceError错误)

但在资源加载期间,当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
        }
    }

}

希望这能奏效

为网络更改创建接收器您可以检测到网络关闭或打开,如下所示您可以向您的活动发送本地广播-

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来检查是否所有的资源都加载到not上,它会给出错误“否”或“是”。错误&“否”表示未完全加载html

ConnectivityManager NetworkCallback用于在用户处于设置屏幕时知道同一WiFi的互联网何时恢复,因为如果互联网恢复,我们需要将用户重定向回应用程序<在此场景中,将调用code>onLinkPropertiesChanged,我们将使用Ping服务检查internet是否可用

注册网络回调

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);
            }
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();
        }
    };
网络回调

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);
            }
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();
        }
    };
网络检查检查互联网是否可用。也许这一步可以忽略,当我写的时候,我想
NET\u CAPABILITY\u 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();
    }
检查服务可用于检查互联网

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;
    }

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

networkInfoWifi.isConnected()
将仅说明是否连接了WiFi,而不是internet可用性。另外,
onLoadResource()
在以异步格式加载资源时也不能很好地工作(这就是我在问题中提到它的原因)。检测网络连接的更好方法是,在应用程序的上下文中使用广播接收器,它会在没有网络可用时通知您。像youTube这样的东西,它会在WiFi网络关闭和打开时发出通知吗?因为我尝试了
ConnectivityManager.NetworkCallback
,在关闭internet时调用
onLost()
,但在1-2秒内,将调用
onAvailable()
。我还尝试了使用
WifiManager的广播接收器。网络状态改变了操作
ConnectivityManager。当WiFi互联网关闭和打开时,连接操作
仍然没有得到正确的呼叫。@Shahal检查我的答案没有互联网你不能加载你的webview,这样你可以像这样检查互联网连接。嘿@沙哈尔问题是否已解决?尝试此场景,连接到WiFi(最好是热点)在该场景中打开和关闭互联网连接。当您关闭internet时,您将获得“未连接-更新变量”,1-2秒后将调用“已连接-更新变量”。yeh在已连接的网络上向您的活动发送广播,并显示“web视图”和“未连接时”错误对话框。当internet关闭时,“未连接-更新变量”和正在调用“已连接-更新变量”。