您的位置:首页 > 移动开发

WebView js判断是否联网后页面自动跳转

2013-12-01 22:13 651 查看


需求:

webview和js的交互,在离线进入app时,打开显示的页面是A页面,如果这时变成在线了,那么应该自动跳转到B页面;如果本来就是在在线时打开的app,那么久会直接进入B页面,就算此时变成离线,也不会变到A页面。(假如:WebView myWebView,A页面url为AURL,B页面url为BURL)


问题:

js端已写有网络判断,在ios使用时是直接监听就可以,但是android端js写的判断无效,这个问题我也不明白是为什么,所以判断网络这个就落到了android手上。


分析:

网络判断这块内容网上有很多,也就那么几句话而已,但是怎么才能实现自动跳转呢?

两个实现方式: 一、用定时器;二、用广播

判断是否联网:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16


public class ConnectNet {
public static boolean isNetworkConnected(Context context) {
// 判断是否联网
ConnectivityManager cwjManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = cwjManager.getActiveNetworkInfo();
if (info != null && info.isAvailable()) {
// 如果联网,返回true
return true;
}
else {
// 不联网,返回false
return false;
}

}
}



方案一:定时器

handle和Runnable的运用,就可以进行更新页面
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18


Handler handler = new Handler();
// 构建Runnable对象,在runnable中更新页面
Runnable runnable = new Runnable() {
@Override
public void run() {
// 更新页面
// 如果联网
if (ConnectNet.isNetworkConnected(context)) {
myWebView.loadUrl(AURL);
handler.removeCallbacks(this);
}
else {
myWebView.loadUrl(BURL);
handler.postDelayed(this, 2000); // 每两秒执行一次runnable
}
}
};
handler.post(runnable);


缺点:

用定时器这么更新,会有一个很大的问题,就是因为是每两秒就执行一次,所以会每两秒就刷新一次页面,也就会一直在刷新,因为是loadUrl,所以屏幕就会一直闪,一直再跳动,这个问题没法解决,所以我还是选择用了广播,也是很简单的一种方法,最早朋友提示我也是用这个就好,只是自己太烂了,知道广播怎么写,却不知道怎么把该写的内容加入进去,也是突然之间想到的:


方案二:广播

将主程序中的myWebView设为public static,以便后面之间调用,应该有其他更好的方法的,我就不去写了

然后主程序就只需判断首次登录时的是否联网,进入哪个页面就好:
1
2
3
4
5
6


if (ConnectNet.isNetworkConnected(context)) {
myWebView.loadUrl(BURL);
}
else {
myWebView.loadUrl(AURL);
}


然后就是如何写广播啦:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26


public class NetCheckReceiver extends BroadcastReceiver {

private static final String TAG = "NetCheckReceiver";
// android 中网络变化时所发的Intent的名字
public static final String netACTION = "android.net.conn.CONNECTIVITY_CHANGE";

@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub

if (intent.getAction().equals(netACTION)) {
Log.e(TAG, "ACTION:" + intent.getAction());
// Intent中ConnectivityManager.EXTRA_NO_CONNECTIVITY这个关键字表示着当前是否连接上了网络
// true 代表网络断开  false 代表网络没有断开
boolean isBreak = intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);
Log.e(TAG, "is break:" + isBreak);
if (isBreak) {
Log.d(TAG, "onTeceive:NOT connected, stopping Updaterservice");
}
else {
Log.d(TAG, "onReceive: connected, starting UpdaaterService");
context.myWebView.loadUrl(BURL);
}
}
}
}


好了,这样就完成了,不过一定要记得广播的话要在AndroidManifest里面进行注册:
1
2
3
4
5


<receiver android:name=".NetCheckReceiver" android:enabled="true">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
</receiver>


还有判断网络的:
1


<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐