android网络编程注意事项之一:移动网络下,防止网络超时甚至连接不上,解决办法--为网络请求设置代理
2013-07-19 12:13
801 查看
Android应用程序访问互联网资源时,在Wifi的情况下处理网络连接按照上文所讲述的方法步骤即可顺利实现;但如果当前Android设备的联网方式是通过移动运营商的网络服务为中转,间接访问的互联网资源时,则就涉及到在创建HTTP链接之前需要设置Proxy,即可尽量避免网络中断访问的情况,顺利访问互联网。Proxy中文即代理。已经插入手机卡的Android设备,点击"设置"→"无线和网络"→"移动网络设置"→"接入点名称",任意点击一接入点,此时显示的内容即为当前运营商为使Android设备通过运营商网络顺利接入互联网而需要设置的代理信息。通常,中国移动的接入点为CMWAP,代理IP是10.0.0.172,端口为80。由于不同运营商其代理设置的不同,为保证代码的一致性及有效性,开发过程中需要封装出能够自适应各种不同Proxy环境并且能够顺利访问互联网的联网代码。封装后的方法为openUrl(),代码如下:
public static HttpURLConnection openUrl(Context context, String urlStr) {URL urlURL = null;HttpURLConnection httpConn = null;try {urlURL = new URL(urlStr);// 需要android.permission.ACCESS_NETWORK_STATE// 在没有网络的情况下,返回值为null。NetworkInfo networkInfo = ((ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo();// 如果是使用的运营商网络if (networkInfo != null) {if (networkInfo.getType() == ConnectivityManager.TYPE_MOBILE) {// 获取默认代理主机ipString host = android.net.Proxy.getDefaultHost();// 获取端口int port = android.net.Proxy.getDefaultPort();if (host != null && port != -1) {// 封装代理連接主机IP与端口号。InetSocketAddress inetAddress = new InetSocketAddress(host, port);// 根据URL链接获取代理类型,本链接适用于TYPE.HTTPjava.net.Proxy.Type proxyType = java.net.Proxy.Type.valueOf(urlURL.getProtocol().toUpperCase());java.net.Proxy javaProxy = new java.net.Proxy(proxyType, inetAddress);httpConn = (HttpURLConnection) urlURL.openConnection(javaProxy);} else {httpConn = (HttpURLConnection) urlURL.openConnection();}} else {httpConn = (HttpURLConnection) urlURL.openConnection();}httpConn.setConnectTimeout(Const.NETWORK_OPEN_TIMEOUT);httpConn.setReadTimeout(Const.NETWORK_READ_TIMEOUT);httpConn.setDoInput(true);} else {// LogOut.out(this, "No Avaiable Network");}} catch (NullPointerException npe) {npe.printStackTrace();} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return httpConn;}由于需要设置Proxy的情况为使用运营商网络,所以代码一开始即使用通过Context获得ConnectivityManager,执行ConnectivityManager.getActiveNetworkInfo()获取当前可用的网络。在有可用网络的情况下,判断其类型,如果networkInfo.getType()返回值为ConnectivityManager.TYPE_MOBILE,则需要设置Proxy;在返回值为ConnectivityManager.TYPE_WIFI的情况下则跳过设置Proxy的步骤。对HttpURLConnection设置Proxy需要指定代理IP及端口号,android.net.Proxy解决了这个问题。执行Proxy.getDefaultHost()和Proxy.getDefaultPort()将返回代理主机的IP及开放端口号,并以这两个信息传参构造InetSocketAddress。InetSocketAddress为IP套接地址,其主要形式可由IP地址与端口号组合而成,亦可用主机域名加端口号组合而成,这种情况下将尝试将主机域名解析为IP地址。封装的方法openUrl()两个参数中第二个参数为网络链接地址,将该地址构造出URL实例后,使用URL.getProtocol()方法即可知该链接地址所使用的协议类型。使用得到的链接协议类型,执行java.net.Proxy.Type的valueOf()方法进一步得到所需Proxy.Type。在InetSocketAddress及Proxy.Type确定的情况下,即可构造java.net.Proxy实例,执行代码为new java.net.Proxy(proxyType, inetAddress)。将新生成的Proxy对象做为参数,执行URL.openConnection(javaProxy),即可得到使用Proxy设置连接互联网的HttpURLConnection。
相关文章推荐
- android网络编程注意事项之一:移动网络下,防止网络超时甚至连接不上,解决办法--为网络请求设置代理
- android网络编程注意事项之一:移动网络下,防止网络超时甚至连接不上,解决办法--为网络请求设置代理
- android网络编程注意事项之一:移动网络下,防止网络超时甚至连接不上,解决办法--为网络请求设置代理
- android网络编程注意事项之一:移动网络下,防止网络超时甚至连接不上,解决办法--为网络请求设置代理
- Android使用AsyncTask设置请求超时的注意事项
- 如何快速解决Java网络编程设置请求超时,还不快加入收藏!
- xx-net在chrome下请检查浏览器代理设置或不是私密连接解决办法
- android 访问移动网络时的wap代理设置
- Android开发-----关于解决Retrofit打印HttpLog和设置连接超时的问题
- 网络编程中如何设置连接超时
- Java网络编程教程之设置请求超时的方法
- 利用wireshark 通过mac os网络共享 抓取 移动设备上发起的 http 网络请求报文 (附:升级 10.10 以后 wireshark启动闪退解决办法)
- android判断网络是否连接一些注意事项(有代码)
- 【已解决】使用android-async-http网络请求框架出现Header[]不识别错误的解决办法
- Android get/post方式请求网络设置超时
- android wap连接网络设置代理
- Android SDK Manager配置中遇到 连接被拒绝, 连接超时问题解决办法之一
- Android在Http连接中设置超时和代理?
- 关于Android 5.0 、6.0 、 7.0代码设置WIFI连接方式为静态IP或DHCP的方法及注意事项