Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android網絡編程注意事項之一:移動網絡下,防止網絡超時甚至連接不上,解決辦法--為網絡請求設置代理

android網絡編程注意事項之一:移動網絡下,防止網絡超時甚至連接不上,解決辦法--為網絡請求設置代理

編輯:關於Android編程

[html]                Android應用程序訪問互聯網資源時,在Wifi的情況下處理網絡連接按照上文所講述的方法步驟即可順利實現;但如果當前Android設備的聯網方式是通過移動運營商的網絡服務為中轉,間接訪問的互聯網資源時,則就涉及到在創建HTTP鏈接之前需要設置Proxy,即可盡量避免網絡中斷訪問的情況,順利訪問互聯網。    Proxy中文即代理。已經插入手機卡的Android設備,點擊"設置"→"無線和網絡"→"移動網絡設置"→"接入點名稱",任意點擊一接入點,此時顯示的內容即為當前運營商為使Android設備通過運營商網絡順利接入互聯網而需要設置的代理信息。             通常,中國移動的接入點為CMWAP,代理IP是10.0.0.172,端口為80。           由於不同運營商其代理設置的不同,為保證代碼的一致性及有效性,開發過程中需要封裝出能夠自適應各種不同Proxy環境並且能夠順利訪問互聯網的聯網代碼。             封裝後的方法為openUrl(),代碼如下:     [html]   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) {                                   // 獲取默認代理主機ip                                   String 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.HTTP                                           java.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;   }     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) {                                 // 獲取默認代理主機ip                                 String 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.HTTP                                         java.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。  
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved