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

來源:互聯網
上載者:User

[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。 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.