編輯:關於Android編程
Android支持JDK提供的URL、URLConnection等網絡通信API,另外Android還內置了HttpClient。
URL(Uniform Resource Locator)對象代表統一資源定位符,它是指向互聯網“資源”的指針。
URL格式:protocol://host:port/resourceName
拓展:JDK還提供了Uri(統一資源標識符)類
當我們獲取到URL對象後,即可調用如下方法來訪問URL對應的資源:
String getFile():獲取資源名
String getHost():獲取主機名
String getPath():獲取路徑部分
int getPort():獲取端口號
String getProtocol():獲取協議名稱
String getQuery():獲取查詢字符串部分
URLConnection openConnection():返回一個URLConnection對象(表示到URL所引用的遠程對象的連接)
InputStream openStream():打開連接,並返回一個用於讀取該URL資源的InputStream
URL對象的openStream()方法可以非常方便的讀取該URL資源的InputStream。
public class URLTest extends Activity {
// 從網絡上下載得到的圖片
Bitmap bitmap;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Thread() {
public void run() {
try {
URL url = new URL("http://avatar.csdn.net/D/F/D/1_smartbetter.jpg");
/**
* 解析輸入流中的圖片
*/
InputStream is = url.openStream(); // 打開URL對應資源的輸入流
bitmap = BitmapFactory.decodeStream(is); // 從InputStream中解析出圖片
is.close();
/**
* 使用IO將輸入流中的圖片下載到本地
*/
is = url.openStream(); // 再次打開URL對應資源的輸入流
OutputStream os = openFileOutput("icon.jpg", MODE_WORLD_READABLE); // 打開手機文件對應的輸出流
byte[] buff = new byte[1024];
int hasRead = 0;
// 將URL對應的資源下載到本地
while((hasRead = is.read(buff)) > 0) {
os.write(buff, 0 , hasRead);
}
is.close();
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
}
注意:需要添加訪問網絡權限
URL的openConnection()方法將返回一個URLConnection對象(表示應用程序和URL之間的通信連接),程序可通過URLConnection實例向該URL發送請求,讀取URL引用的資源。
如下GetPostUtil工具類向Web站點發送GET請求、POST請求,並取得響應:
public class GetPostUtil {
/**
* 向指定URL發送GET請求
* @param url 請求參數,name1=value1&name2=value2
* @param params
* @return 遠程資源的響應
*/
public static String doGet(String url, String params) {
String result = "";
BufferedReader in = null;
try {
String urlName = url + "?" + params;
URL realUrl = new URL(urlName);
URLConnection conn = realUrl.openConnection(); // 打開和URL之間的連接
// 設置通用的請求屬性
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
conn.connect(); // 建立實際的連接
Map> map = conn.getHeaderFields(); // 獲取所有響應頭字段
// 遍歷所有的響應頭字段
for (String key : map.keySet()) {
System.out.println(key + ":" + map.get(key));
}
// 定義BufferedReader輸入流來讀取URL的響應
in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += "\n" + line;
}
} catch (Exception e) {
System.out.println("請求異常!" + e);
e.printStackTrace();
} finally {
try {
if (in != null) {
in.close();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
return result;
}
/**
* 向指定URL發送POST請求
* @param url
* @param params 請求參數,name1=value1&name2=value2
* @return 遠程資源的響應
*/
public static String doPost(String url, String params) {
PrintWriter out = null;
BufferedReader in = null;
String result = "";
try {
URL realUrl = new URL(url);
URLConnection conn = realUrl.openConnection(); // 打開和URL之間的連接
// 設置通用的請求屬性
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
// 發送POST請求必須設置如下兩行
conn.setDoOutput(true);
conn.setDoInput(true);
// 獲取URLConnection對象對應的輸出流
out = new PrintWriter(conn.getOutputStream());
out.print(params); // 發送請求參數
out.flush(); // flush輸出流的緩沖
// 定義BufferedReader輸入流來讀取URL的響應
in = new BufferedReader(
new InputStreamReader(conn.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += "\n" + line;
}
}
catch (Exception e) {
System.out.println("請求異常!" + e);
e.printStackTrace();
} finally {
try {
if (out != null) {
out.close();
}
if (in != null) {
in.close();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
return result;
}
}
HttpURLConnection繼承了URLConnection做了改進,增加了一些用於操作HTTP資源的便捷方法:
int getResponseCode():獲取服務器的響應代碼
String getResponseMessage():獲取服務器的響應消息
String getRequestMethod():獲取發送請求的方法
void setRequestMethod(String method):設置發送請求的方法
HttpClient是Apache的一個開源項目,可用於發送HTTP請求,接受Http響應,不會緩存服務器的響應,不能執行HTML中JS代碼,也不會對頁面進行任何解析、處理。HttpClient就是一個增強版的HttpURLConnection。
接下來看看HttpClient的用法:
public class HttpClientTest extends Activity {
HttpClient httpClient;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
...
httpClient = new DefaultHttpClient(); // 創建DefaultHttpClient對象
...
}
/**
* Get請求
*/
public void doHttpClientGet(View view) {
new Thread() {
@Override
public void run() {
// 創建一個HttpGet對象
HttpGet get = new HttpGet("http://192.168.1.10:8080/server/page.jsp");
try {
// 發送GET請求
HttpResponse httpResponse = httpClient.execute(get);
HttpEntity entity = httpResponse.getEntity();
if (entity != null) {
// 讀取服務器響應
BufferedReader br = new BufferedReader(new InputStreamReader(entity.getContent()));
String line = null;
while ((line = br.readLine()) != null) {
System.out.println("服務器響應:"+line);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
/**
* Post請求
* 模擬post請求登錄
*/
public void doHttpClientPost(View view) {
final String name = "zhangsan";
final String pass = "123";
new Thread() {
@Override
public void run() {
try {
HttpPost post = new HttpPost("http://192.168.1.10:8080/server/login.jsp");
// 如果傳遞參數量大的話可以對傳遞參數進行封裝
List params = new ArrayList();
params.add(new BasicNameValuePair("name", name));
params.add(new BasicNameValuePair("pass", pass));
// 設置請求參數
post.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
// 發送POST請求
HttpResponse response = httpClient.execute(post);
// 返回響應
if (response.getStatusLine().getStatusCode() == 200) {
String msg = EntityUtils.toString(response.getEntity());
Looper.prepare();
System.out.println(msg);
Looper.loop();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
}
(1)Android-async-http
(2)Afinal框架
(3)xUtils3框架
ToggleButton的狀態只能是選中和未選中,並且需要為不同的狀態設置不同的顯示文本。以下案例為ToggleButton的用法目錄結構main.xml布局文件復制代碼
開學到現在一直都在學著去搞明白一個簡單的游戲。寫完代碼之後,發現主界面顯示的某些圖片比正常的大了許多。本來以為是代碼寫錯了,反反復復,來來回回的檢查代碼,真心沒有錯誤。。
點擊按鈕,先自動進行下拉刷新,也可以手動刷新,刷新完後,最後就多一行數據。有四個選項卡。前兩天導師要求做一個給本科學生預定機房座位的app,出發點來自這裡。做著做著遇到很
Android Http 客戶端編程之GET 說起Http編程,不盡然想起GET和POST兩種請求方式,本文以簡潔明了的的步驟和說明,將Android中常用