在Android開發中,一般通過網路進行訪問伺服器端的信息(存儲和檢索網路中的數據),如API介面,WebService,網路圖片等。今天主要講解Http訪問的常用方法,僅供學習分享使用。 ...
概述
在Android開發中,一般通過網路進行訪問伺服器端的信息(存儲和檢索網路中的數據),如API介面,WebService,網路圖片等。今天主要講解Http訪問的常用方法,僅供學習分享使用。
涉及知識點
- URL 表示互聯網位置的統一資源標識符。
- HttpURLConnection 表示一個URL的Http連接,是一個抽象類,通過URL中的 openConnection()實例化一個連接對象。
- setConnectTimeout(5000) 設置超時時間,setRequestMethod("GET") 設置訪問方式。
- getResponseCode() 獲取返回碼,如200表示成功。
- getInputStream() 返回讀取到數據的位元組流; getOutputStream() 返回往指定URL寫入數據的位元組流。
- ByteArrayOutputStream 數組和輸出流之間的轉換。
- WebView 用於顯示Web Page的一個控制項,通過loadDataWithBaseURL(String baseUrl, String data,String mimeType, String encoding, String historyUrl)載入內容。
Http訪問步驟
- 創建一個URL對象: URL url = new URL(https://www.baidu.com);
- 調用URL對象的openConnection( )來獲取HttpURLConnection對象實例: HttpURLConnection conn = (HttpURLConnection) url.openConnection();
- 設置HTTP請求使用的方法:GET或者POST,或者其他請求方式比如:PUT conn.setRequestMethod("GET");
- 設置連接超時,讀取超時的毫秒數,以及伺服器希望得到的一些消息頭 conn.setConnectTimeout(6*1000); conn.setReadTimeout(6 * 1000);
- 調用getInputStream()方法獲得伺服器返回的輸入流,然後輸入流進行讀取了 InputStream in = conn.getInputStream();
- 最後調用disconnect()方法將HTTP連接關掉 conn.disconnect();
示例圖
如下圖所示:
核心代碼
獲取數據類
1 /** 2 * Created by hex on 2019/4/6. 3 */ 4 public class GetData { 5 // 定義一個獲取網路圖片數據的方法: 6 public static byte[] getImage(String path) throws Exception { 7 URL url = new URL(path); 8 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 9 // 設置連接超時為5秒 10 conn.setConnectTimeout(5000); 11 // 設置請求類型為Get類型 12 conn.setRequestMethod("GET"); 13 // 判斷請求Url是否成功 14 if (conn.getResponseCode() != 200) { 15 throw new RuntimeException("請求url失敗"); 16 } 17 InputStream inStream = conn.getInputStream(); 18 byte[] bt = StreamTool.read(inStream); 19 inStream.close(); 20 return bt; 21 } 22 23 // 獲取網頁的html源代碼 24 public static String getHtml(String path) throws Exception { 25 URL url = new URL(path); 26 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 27 conn.setConnectTimeout(5000); 28 conn.setRequestMethod("GET"); 29 if (conn.getResponseCode() == 200) { 30 InputStream in = conn.getInputStream(); 31 byte[] data = StreamTool.read(in); 32 String html = new String(data, "UTF-8"); 33 return html; 34 } 35 return null; 36 } 37 }
InputStream轉換為byte[]功能
1 /** 2 * Created by Administrator on 2019/4/6. 3 */ 4 public class StreamTool { 5 //從流中讀取數據 6 public static byte[] read(InputStream inStream) throws Exception { 7 ByteArrayOutputStream outStream = new ByteArrayOutputStream(); 8 byte[] buffer = new byte[1024]; 9 int len = 0; 10 while ((len = inStream.read(buffer)) != -1) { 11 outStream.write(buffer, 0, len); 12 } 13 inStream.close(); 14 return outStream.toByteArray(); 15 } 16 }
刷新界面賦值
1 // 用於刷新界面 2 private Handler handler = new Handler() { 3 public void handleMessage(android.os.Message msg) { 4 switch (msg.what) { 5 case 0x001: 6 hideAllWidget(); 7 imgPic.setVisibility(View.VISIBLE); 8 imgPic.setImageBitmap(bitmap); 9 Toast.makeText(MainActivity.this, "圖片載入完畢", Toast.LENGTH_SHORT).show(); 10 break; 11 case 0x002: 12 hideAllWidget(); 13 scroll.setVisibility(View.VISIBLE); 14 txtshow.setText(detail); 15 Toast.makeText(MainActivity.this, "HTML代碼載入完畢", Toast.LENGTH_SHORT).show(); 16 break; 17 case 0x003: 18 hideAllWidget(); 19 webView.setVisibility(View.VISIBLE); 20 webView.loadDataWithBaseURL("", detail, "text/html", "UTF-8", ""); 21 Toast.makeText(MainActivity.this, "網頁載入完畢", Toast.LENGTH_SHORT).show(); 22 break; 23 default: 24 break; 25 } 26 } 27 28 ; 29 };
如果要訪問網路,還需要有相應的許可權
1 <uses-permission android:name="android.permission.INTERNET" />
備註
關於Http訪問的相關知識還有很多,本文知識簡單粗略的講解,希望拋磚引玉,共同學習。