使用HttpURLConnection的步驟如下:
- 創建一個URL對象:URL url = new URL(http://www.baidu.com);
- 調用URL對象的openConnection( )來獲取HttpURLConnection對象實例:HttpURLConnection conn = (HttpURLConnection) url.openConnection();
- 設置HTTP請求使用的方法:GET或者POST,或者其他請求方式比如:PUTconn.setRequestMethod("GET");
- 設置連接超時,讀取超時的毫秒數,以及服務器希望得到的一些消息頭conn.setConnectTimeout(6*1000);conn.setReadTimeout(6 * 1000);
- 調用getInputStream()方法獲得服務器返回的輸入流,然後輸入流進行讀取了InputStream in = conn.getInputStream();
- 最後調用disconnect()方法將HTTP連接關掉conn.disconnect();
實例效果圖如下:
首先,附上兩個工具類:GetData.java(獲取網絡圖片),StreamTool.java(將流轉化爲二進制數組的工具類)。
StreamTool.java
package com.deepreality.httpurlconnectiondemo; import java.io.ByteArrayOutputStream; import java.io.InputStream; /** * 將流轉化爲二進制數組的工具類 */ public class StreamTool { //從流中讀取數據 public static byte[] read(InputStream inStream) throws Exception{ ByteArrayOutputStream outStream = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len = 0; while((len = inStream.read(buffer)) != -1) { outStream.write(buffer,0,len); } inStream.close(); return outStream.toByteArray(); } }
GetData.java
package com.deepreality.httpurlconnectiondemo; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; /** * 這個類主要用於獲取網絡圖片之類的 */ public class GetData { // 定義一個獲取網絡圖片數據的方法: public static byte[] getImage(String path) throws Exception { URL url = new URL(path); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // 設置連接超時爲5秒 conn.setConnectTimeout(5000); // 設置請求類型爲Get類型 conn.setRequestMethod("GET"); // 判斷請求Url是否成功 if (conn.getResponseCode() != 200) { throw new RuntimeException("請求url失敗"); } InputStream inStream = conn.getInputStream(); byte[] bt = StreamTool.read(inStream); inStream.close(); return bt; } // 獲取網頁的html源代碼 public static String getHtml(String path) throws Exception { URL url = new URL(path); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setConnectTimeout(5000); conn.setRequestMethod("GET"); if (conn.getResponseCode() == 200) { InputStream in = conn.getInputStream(); byte[] data = StreamTool.read(in); String html = new String(data, "UTF-8"); return html; } return null; } }
MainActivity.java的代碼如下:
package com.deepreality.httpurlconnectiondemo; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Handler; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.ContextMenu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.webkit.WebView; import android.widget.ImageView; import android.widget.ScrollView; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends AppCompatActivity { private TextView txtMenu, txtshow; private ImageView imgPic; private WebView webView; private ScrollView scroll; private Bitmap bitmap; private String detail = ""; private boolean flag = false; private final static String PIC_URL = "http://ww2.sinaimg.cn/large/7a8aed7bgw1evshgr5z3oj20hs0qo0vq.jpg"; private final static String HTML_URL = "http://www.baidu.com"; // 用於刷新界面 private Handler handler = new Handler() { public void handleMessage(android.os.Message msg) { switch (msg.what) { case 0x001: hideAllWidget(); imgPic.setVisibility(View.VISIBLE); imgPic.setImageBitmap(bitmap); Toast.makeText(MainActivity.this, "圖片加載完畢", Toast.LENGTH_SHORT).show(); break; case 0x002: hideAllWidget(); scroll.setVisibility(View.VISIBLE); txtshow.setText(detail); Toast.makeText(MainActivity.this, "HTML代碼加載完畢", Toast.LENGTH_SHORT).show(); break; case 0x003: hideAllWidget(); webView.setVisibility(View.VISIBLE); webView.loadDataWithBaseURL("", detail, "text/html", "UTF-8", ""); Toast.makeText(MainActivity.this, "網頁加載完畢", Toast.LENGTH_SHORT).show(); break; default: break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bindViews(); } @Override protected void onDestroy() { super.onDestroy(); if (bitmap.isRecycled()) { bitmap.recycle(); } } private void bindViews() { txtMenu = (TextView) findViewById(R.id.txtMenu); txtshow = (TextView) findViewById(R.id.txtshow); imgPic = (ImageView) findViewById(R.id.imgPic); webView = (WebView) findViewById(R.id.webView); scroll = (ScrollView) findViewById(R.id.scroll); registerForContextMenu(txtMenu); } // 定義一個隱藏所有控件的方法: private void hideAllWidget() { imgPic.setVisibility(View.GONE); scroll.setVisibility(View.GONE); webView.setVisibility(View.GONE); } /** * 重寫上下文菜單的創建方法 * @param menu * @param v * @param menuInfo */ @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { MenuInflater inflator = new MenuInflater(this); inflator.inflate(R.menu.menus, menu); super.onCreateContextMenu(menu, v, menuInfo); } /** * 上下文菜單被點擊是觸發該方法 * @param item * @return */ @Override public boolean onContextItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.one: new Thread() { public void run() { try { byte[] data = GetData.getImage(PIC_URL); bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); } catch (Exception e) { e.printStackTrace(); } handler.sendEmptyMessage(0x001); } }.start(); break; case R.id.two: new Thread() { public void run() { try { detail = GetData.getHtml(HTML_URL); } catch (Exception e) { e.printStackTrace(); } handler.sendEmptyMessage(0x002); } }.start(); break; case R.id.three: if (detail.equals("")) { Toast.makeText(MainActivity.this, "先請求HTML先嘛~", Toast.LENGTH_SHORT).show(); } else { handler.sendEmptyMessage(0x003); } break; } return true; } }
其中,menus.xml是創建於res/menu/下面的菜單文件。
menus.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" tools:context="com.example.menutest.MainActivity" > <item android:id="@+id/one" android:orderInCategory="100" android:title="加載圖片"/> <item android:id="@+id/two" android:orderInCategory="200" android:title="加載HTML"/> <item android:id="@+id/three" android:orderInCategory="200" android:title="加載網頁"/> </menu>