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