A. android 中怎麼寫好網路請求框架
Android程序最重要的模塊就是網路部分,如何從網路上下載數據,如何將處理過的數據上傳至網路,往往是android程序的關鍵環節。
Android原生提供基於HttpClient和HttpUrlConnection的兩種網路訪問方式。利用原生的這兩種方式編寫網路代碼,需要自己考慮很多,獲取數據或許可以,但是如果要將手機本地數據上傳至網路,根據不同的web端介面,需要組織不同的數據內容上傳,給手機端造成了很大的工作量。
目前有幾種快捷的網路開發開源框架,給我們提供了非常大的便利,他們應該是android網路處理部分開源框架的前三名。
1.https://github.com/loopj/android-async-http
loopj這款開源框架一直是我鍾愛的網路框架,在我寫過的相當多的程序中,一直使用該框架,以至於對這個框架產生了厭倦的情緒。
太詳細的使用文檔,太簡單的使用方式,它就像是一門高級語言,定製好了所有的東西,你只需要拼湊一下就能夠處理,所以你想定製更加細節的操作,只有自己動手,反而造成了一些不必要的麻煩。
loopj在前一段時間對https的支持並不好,如果要支持https,則需要費點功夫。
1.4幾個版本的升級對前部分代碼的承接性不夠好,造成了我對這個框架的厭倦。
B. android post網路數據的請求
public static String HttpPostMethod(String get_url,
List<NameValuePair> params) {
String result = "";
HttpParams basicHttpParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(basicHttpParams, 15 * 1000);
HttpConnectionParams.setSoTimeout(basicHttpParams, 15 * 1000);
HttpClient htc = new DefaultHttpClient(basicHttpParams);
HttpResponse httpResponse = null;
try {
HttpPost httpPost = new HttpPost(get_url);
// response = htc.execute(request);
// 設置httpPost請求參數
// 創建參數隊列
httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded");//json
httpPost.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
// httpResponse = new DefaultHttpClient().execute(httpPost);
httpResponse = htc.execute(httpPost);
// System.out.println(httpResponse.getStatusLine().getStatusCode());
Log.d("zh1", get_url+" " + httpResponse.getStatusLine().getStatusCode());
if (httpResponse.getStatusLine().getStatusCode() == 200) {
// 第三步,使用getEntity方法活得返回結果
result = EntityUtils.toString(httpResponse.getEntity(), HTTP.UTF_8);
if(result==null||result.equals("")){
return null;
}
}else{
return null;
}
} catch (ClientProtocolException e) {
e.printStackTrace();
result = null;
} catch (IOException e) {
e.printStackTrace();
result = null;
}
return result;
}
C. android如何訪問本地網路
如果你是打算用手機測試移動版網頁的話(同區域網手機訪問pc上的html)。
那可以將區域網內的設備都設置成靜態ip。然後使用iis或php環境將網頁放到站點目錄下。
然後就可以通過ip進行訪問了。
如果你打算用手機訪問手機上的html頁面
那你可以安裝一個AndroPHP 然後將html頁面放到站點目錄下。然後使用給定的ip訪問即可
參考內容如下:
Android應用經常會和伺服器端交互,這就需要手機客戶端發送網路請求,下面介紹四種常用網路請求方式,我這邊是通過Android單元測試來完成這四種方法的,還不清楚Android的單元測試的同學們請看Android開發技巧總結中的Android單元測試的步驟一文。
java.net包中的HttpURLConnection類
Get方式:
// Get方式請求
public static void requestByGet() throws Exception {
String path = "https://reg.163.com/logins.jsp?id=helloworld&pwd=android";
// 新建一個URL對象
URL url = new URL(path);
// 打開一個HttpURLConnection連接
HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
// 設置連接超時時間
urlConn.setConnectTimeout(5 * 1000);
// 開始連接
urlConn.connect();
// 判斷請求是否成功
if (urlConn.getResponseCode() == HTTP_200) {
// 獲取返回的數據
byte[] data = readStream(urlConn.getInputStream());
Log.i(TAG_GET, "Get方式請求成功,返回數據如下:");
Log.i(TAG_GET, new String(data, "UTF-8"));
} else {
Log.i(TAG_GET, "Get方式請求失敗");
}
// 關閉連接
urlConn.disconnect();
}
Post方式:
// Post方式請求
public static void requestByPost() throws Throwable {
String path = "https://reg.163.com/logins.jsp";
// 請求的參數轉換為byte數組
String params = "id=" + URLEncoder.encode("helloworld", "UTF-8")
+ "&pwd=" + URLEncoder.encode("android", "UTF-8");
byte[] postData = params.getBytes();
// 新建一個URL對象
URL url = new URL(path);
// 打開一個HttpURLConnection連接
HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
// 設置連接超時時間
urlConn.setConnectTimeout(5 * 1000);
// Post請求必須設置允許輸出
urlConn.setDoOutput(true);
// Post請求不能使用緩存
urlConn.setUseCaches(false);
// 設置為Post請求
urlConn.setRequestMethod("POST");
urlConn.setInstanceFollowRedirects(true);
// 配置請求Content-Type
urlConn.setRequestProperty("Content-Type",
"application/x-www-form-urlencode");
// 開始連接
urlConn.connect();
// 發送請求參數
DataOutputStream dos = new DataOutputStream(urlConn.getOutputStream());
dos.write(postData);
dos.flush();
dos.close();
// 判斷請求是否成功
if (urlConn.getResponseCode() == HTTP_200) {
// 獲取返回的數據
byte[] data = readStream(urlConn.getInputStream());
Log.i(TAG_POST, "Post請求方式成功,返回數據如下:");
Log.i(TAG_POST, new String(data, "UTF-8"));
} else {
Log.i(TAG_POST, "Post方式請求失敗");
}
}
org.apache.http包中的HttpGet和HttpPost類
Get方式:
// HttpGet方式請求
public static void requestByHttpGet() throws Exception {
String path = "https://reg.163.com/logins.jsp?id=helloworld&pwd=android";
// 新建HttpGet對象
HttpGet httpGet = new HttpGet(path);
// 獲取HttpClient對象
HttpClient httpClient = new DefaultHttpClient();
// 獲取HttpResponse實例
HttpResponse httpResp = httpClient.execute(httpGet);
// 判斷是夠請求成功
if (httpResp.getStatusLine().getStatusCode() == HTTP_200) {
// 獲取返回的數據
String result = EntityUtils.toString(httpResp.getEntity(), "UTF-8");
Log.i(TAG_HTTPGET, "HttpGet方式請求成功,返回數據如下:");
Log.i(TAG_HTTPGET, result);
} else {
Log.i(TAG_HTTPGET, "HttpGet方式請求失敗");
}
}
Post方式:
// HttpPost方式請求
public static void requestByHttpPost() throws Exception {
String path = "https://reg.163.com/logins.jsp";
// 新建HttpPost對象
HttpPost httpPost = new HttpPost(path);
// Post參數
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("id", "helloworld"));
params.add(new BasicNameValuePair("pwd", "android"));
// 設置字元集
HttpEntity entity = new UrlEncodedFormEntity(params, HTTP.UTF_8);
// 設置參數實體
httpPost.setEntity(entity);
// 獲取HttpClient對象
HttpClient httpClient = new DefaultHttpClient();
// 獲取HttpResponse實例
HttpResponse httpResp = httpClient.execute(httpPost);
// 判斷是夠請求成功
if (httpResp.getStatusLine().getStatusCode() == HTTP_200) {
// 獲取返回的數據
String result = EntityUtils.toString(httpResp.getEntity(), "UTF-8");
Log.i(TAG_HTTPGET, "HttpPost方式請求成功,返回數據如下:");
Log.i(TAG_HTTPGET, result);
} else {
Log.i(TAG_HTTPGET, "HttpPost方式請求失敗");
}
}
以上是一些部分代碼,測試的時候在測試類中運行對應的測試方法即可。
E. Android用到的幾種網路請求方式
HttpURLConnection書寫時比較繁瑣,但運行效率較高 ;
HttpClient書寫變的容易,並且便於理解,運行效率不如HttpURLConnection。
F. 如何在Android開發中用HttpClient連接網路數據
在Android的project的文件清單配置好網路許可權;
找一個可用的介面url;
下面貼個代碼,主要是這幾步:
//用HttpClient發送請求,分為五步
//第一步:創建HttpClient對象
HttpClienthttpCient=newDefaultHttpClient();
//第二步:創建代表請求的對象,參數是訪問的伺服器地址
HttpGethttpGet=newHttpGet("http://www..com");
try{
//第三步:執行請求,獲取伺服器發還的相應對象
HttpResponsehttpResponse=httpCient.execute(httpGet);
//第四步:檢查相應的狀態是否正常:檢查狀態碼的值是200表示正常
if(httpResponse.getStatusLine().getStatusCode()==200){
//第五步:從相應對象當中取出數據,放到entity當中
HttpEntityentity=httpResponse.getEntity();
Stringresponse=EntityUtils.toString(entity,"utf-8");//將entity當中的數據轉換為字元串
}
這里要注意,如果在安卓裡面記得用子線程進行網路請求!
G. android 開發.怎麼訪問移動網路
APN(Access Point Name),即「接入點名稱」,用來標識GPRS的業務種類,目前分為兩大類:CMWAP(通過GPRS訪問WAP業務)、CMNET(除了WAP以外的服務目前都用CMNET,比如連接網際網路等)。 APN的英文全稱是Access Point Name,中文全稱叫接入點,是您在通過手機上網時必須配置的一個參數,它決定了您的手機通過哪種接入方式來訪問網路。 移動手機的默認上網配置有兩種:CMWAP和CMNET。一些使用移動辦公的大客戶,通常會使用專用APN,其接入點隨意定義,只要和該省運營商其他APN不沖突即可。 CMWAP也叫移動夢網,通過該接入點可接入一個比較大的移動私網,網內有大量的手機應用下載及資源訪問。因為CMWAP不接入互聯網,只接入移動運營商的私網,所以流量費用比較低廉。 CMNET也叫GPRS連接互聯網,通常每個省的運營商會提供若干個Internet出口以供CMNET撥號用戶使用。其流量費用較CMWAP要高一些。 目前國內銷售的手機,如果是非智能機,通常已配置好CMWAP連接,智能機通常會配置CMWAP和CMNET連接。如需手動添加這些配置,請參考手機說明書。 專有APN在功能上可以和Internet的VPN做類比,實際上他就是基於GPRS的VPN網路。 專有APN常見組網方式 1,運營商部署一條專線接入到企業的網路中,局端和企業端路由器之間採用私有IP進行連接。 2,局端互連路由器與GGSN採用GRE隧道連接。 專有APN的幾個重要特點: 1,除非運營商分配一個Internet IP地址,否則計算機沒有任何辦法通過Internet訪問該APN中的主機。 2,只有手機卡號在APN中的白名單之列,該手機才可以接入該APN。 3,企業客戶可以建立一套RADIUS和DHCP伺服器,GGSN向RADIUS伺服器提供用戶主叫號碼,採用主叫號碼和用戶賬號相結合的認證方式;用戶通過認證後由DHCP伺服器分配企業內部的靜態IP地址。補充:該認證方式不一定適合於每個省的運營商,這取決於該省運營商的APN管理平台。 GPRS專網系統終端上網登錄伺服器平台的流程為: 1)用戶發出GPRS登錄請求,請求中包括由運營商為GPRS專網系統專門分配的專網APN; 2)根據請求中的APN,SGSN向DNS伺服器發出查詢請求,找到與企業伺服器平台連接的GGSN,並將用戶請求通過GTP隧道封裝送給GGSN; 3)GGSN將用戶認證信息(包括手機號碼、用戶賬號、密碼等)通過專線送至Radius進行認證; 4)Radius認證伺服器看到手機號等認證信息,確認是合法用戶發來的請求,向DHCP伺服器請求分配用戶地址; 5)Radius認證通過後,由Radius向GGSN發送攜帶用戶地址的確認信息; 6)用戶得到了IP地址,就可以攜帶數據包,對GPRS專網系統信息查詢和業務處理平台進行訪問。
H. Android網路操作的幾種方法
第一種方式:使用HttpURLConnection進行聯網操作
這個方法需要我們手動構建一個http請求包,發送到指定的伺服器
get方式
設置URL
打開連接
設置請求方法為get
設置連接超時時間
設置讀取超時時間
把當前的request發送到伺服器端
等待伺服器的響應(此處會阻塞)
獲得響應碼(並在響應碼中做相應的操作),因為安卓子線程內不允許做UI更新的操作,所以需要轉到主線程來做(通過安卓中的handler來將信息傳遞到主線程)
publicvoidgetPic(Viewv){
newThread(newRunnable(){
@Override
publicvoidrun(){
try{
//首先要支出伺服器的地址
URLurl=newURL("http://192.168.2.1/day10_NetworkServer/brushli.jpg");
//通過http連接
=(HttpURLConnection)url.openConnection();
//設置請求方式,並設置等待響應時間
httpurlConnection.setRequestMethod("GET");
httpurlConnection.setConnectTimeout(5000);
//把當前的request發送到伺服器(安卓不允許在主線程內做耗時操作,如連接伺服器)
httpurlConnection.connect();
//發送完連接後等待操作,這個是阻塞式方法,
intresponseCode=httpurlConnection.getResponseCode();
//根據得到的響應代碼和response的信息作出相應的操作
if(responseCode==200){
//從伺服器讀取正確與否的信息
InputStreamis=httpurlConnection.getInputStream();
Filefile=newFile("/data/data/com.rgd.day10_network_3/files");
file.mkdir();
FileOutputStreamfos=newFileOutputStream(newFile("/data/data/com.rgd.day10_network_3/files/brushli.jpg"));
byte[]buffer=newbyte[1024];
intread;
while((read=is.read(buffer))!=-1){
fos.write(buffer,0,read);
}
//由於子線程不允許做UI更新操作,與要通過Handler進行和主線程的通信操作
Messagemsg=newMessage();
msg.what=1;
handler.sendMessage(msg);
fos.close();
is.close();
}
}catch(MalformedURLExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
}
}).start();
}
Handlerhandler=newHandler(){
@Override
publicvoidhandleMessage(Messagemsg){
super.handleMessage(msg);
switch(msg.what){
case1:
Toast.makeText(MainActivity.this,"保存圖片成功",Toast.LENGTH_LONG).show();
break;
case2:
Toast.makeText(MainActivity.this,"保存MP3成功",Toast.LENGTH_LONG).show();
break;
case3:
Toast.makeText(MainActivity.this,"保存視頻成功",Toast.LENGTH_SHORT).show();
default:
break;
}
}
};
2.post方式
操作跟get差不多,除了post傳遞信息是通過正文傳遞的,而get是放在連接中的
newThread(newRunnable(){
@Override
publicvoidrun(){
try{
//首先要支出伺服器的地址
URLurl=newURL("http://192.168.106.1/day10_NetworkServer/servlet/loginInfo");
//通過http連接
=(HttpURLConnection)url.openConnection();
//設置請求方式,並設置等待響應時間
httpurlConnection.setRequestMethod("POST");
httpurlConnection.setConnectTimeout(5000);
Stringdata="username="+username+"&password="+password+"&email="+email+"&phonenumber="+phonenumber;
OutputStreamoutputStream=httpurlConnection.getOutputStream();
outputStream.write(data.getBytes());
//把當前的request發送到伺服器(安卓不允許在主線程內做耗時操作,如連接伺服器)
httpurlConnection.connect();
//發送完連接後等待操作,這個是阻塞式方法,
intresponseCode=httpurlConnection.getResponseCode();
//根據得到的響應代碼和response的信息作出相應的操作
if(responseCode==200){
//從伺服器讀取正確與否的信息
InputStreamis=httpurlConnection.getInputStream();
byte[]buffer=newbyte[1024];
intread=is.read(buffer);
Stringresult=newString(buffer,0,read);
//由於子線程不允許做UI更新操作,與要通過Handler進行和主線程的通信操作
Messagemsg=newMessage();
msg.what=1;
handler.sendMessage(msg);
}else{
Messagemsg=newMessage();
msg.what=-1;
handler.sendMessage(msg);
}
}catch(MalformedURLExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
}
}).start();
I. Android如何獲取網路連接狀態及怎樣調用網路配置界面
1. Android獲取網路連接狀態的代碼如下:
public boolean isNetworkConnected(Context context) {
if (context != null) {
ConnectivityManager mConnectivityManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
if (mNetworkInfo != null) {
return mNetworkInfo.isAvailable();
}
}
return false;
}
2.轉跳到網路設置界面:
Intent wifiSettingsIntent = new Intent("android.settings.WIFI_SETTINGS");
startActivity(wifiSettingsIntent);