Android網路:HTTP之利用HttpURLConnection訪問網頁、擷取網狀圖片執行個體 (附源碼)

來源:互聯網
上載者:User

如前文所示的TCP區域網路傳送東西,除了對傳輸層的TCP/UDP支援良好外,Android對HTTP(超文字傳輸通訊協定 (HTTP))也提供了很好的支援,這裡包括兩種介面:

1、標準Java介面(java.net) ----HttpURLConnection,可以實現簡單的基於URL請求、響應功能;

2、Apache介面(org.appache.http)----HttpClient,使用起來更方面更強大。一般來說,用這種介面。不過本文還是把第一種介面過一下。

任何一種介面,無外乎四個準系統:訪問網頁、下載圖片或檔案、上傳檔案.本文示範的是訪問網頁和下載圖片。HttpURLConnection繼承自URLConnection類,用它可以發送和介面任何類型和長度的資料,且預先不用知道資料流的長度,可以佈建要求方式get或post、逾時時間。

下面直接貼代碼,代碼目的有兩個,一是訪問百度首頁,擷取其返回的html字串,二是給定URL下載個圖片並顯示出來。後續將展開系列博文介紹HTTP相關知識。

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:id="@+id/parent_view"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    tools:context=".MainActivity" >    <FrameLayout        android:layout_width="match_parent"        android:layout_height="match_parent" >        <TextView            android:id="@+id/textview_show"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="@string/hello_world" />        <ImageView            android:id="@+id/imagview_show"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_gravity="center" />    </FrameLayout>    <Button        android:id="@+id/btn_visit_web"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignParentBottom="true"        android:layout_alignParentLeft="true"        android:text="訪問百度" />    <Button         android:id="@+id/btn_download_img"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignParentBottom="true"        android:layout_toRightOf="@id/btn_visit_web"        android:text="下載圖片"/></RelativeLayout>

MainActivity.java

package org.yanzi.httpurlconnection;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;import android.app.Activity;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.AsyncTask;import android.os.Bundle;import android.view.Menu;import android.view.View;import android.view.ViewGroup;import android.widget.Button;import android.widget.ImageView;import android.widget.ProgressBar;import android.widget.RelativeLayout;import android.widget.TextView;public class MainActivity extends Activity {Button visitWebBtn = null;Button downImgBtn = null;TextView showTextView = null;ImageView showImageView = null;String resultStr = "";ProgressBar progressBar = null;ViewGroup viewGroup = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initUI();visitWebBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubshowImageView.setVisibility(View.GONE);showTextView.setVisibility(View.VISIBLE);Thread visitBaiduThread = new Thread(new VisitWebRunnable());visitBaiduThread.start();try {visitBaiduThread.join();if(!resultStr.equals("")){showTextView.setText(resultStr);}} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}});downImgBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubshowImageView.setVisibility(View.VISIBLE);showTextView.setVisibility(View.GONE);String imgUrl = "http://www.shixiu.net/d/file/p/2bc22002a6a61a7c5694e7e641bf1e6e.jpg";new DownImgAsyncTask().execute(imgUrl);}});}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}public void initUI(){showTextView = (TextView)findViewById(R.id.textview_show);showImageView = (ImageView)findViewById(R.id.imagview_show);downImgBtn = (Button)findViewById(R.id.btn_download_img);visitWebBtn = (Button)findViewById(R.id.btn_visit_web);}/** * 擷取指定URL的響應字串 * @param urlString * @return */private String getURLResponse(String urlString){HttpURLConnection conn = null; //連線物件InputStream is = null;String resultData = "";try {URL url = new URL(urlString); //URL對象conn = (HttpURLConnection)url.openConnection(); //使用URL開啟一個連結conn.setDoInput(true); //允許輸入資料流,即允許下載conn.setDoOutput(true); //允許輸出資料流,即允許上傳conn.setUseCaches(false); //不使用緩衝conn.setRequestMethod("GET"); //使用get請求is = conn.getInputStream();   //擷取輸入資料流,此時才真正建立連結InputStreamReader isr = new InputStreamReader(is);BufferedReader bufferReader = new BufferedReader(isr);String inputLine  = "";while((inputLine = bufferReader.readLine()) != null){resultData += inputLine + "\n";}} catch (MalformedURLException e) {// TODO Auto-generated catch blocke.printStackTrace();}catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{if(is != null){try {is.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if(conn != null){conn.disconnect();}}return resultData;}/** * 從指定URL擷取圖片 * @param url * @return */private Bitmap getImageBitmap(String url){URL imgUrl = null;Bitmap bitmap = null;try {imgUrl = new URL(url);HttpURLConnection conn = (HttpURLConnection)imgUrl.openConnection();conn.setDoInput(true);conn.connect();InputStream is = conn.getInputStream();bitmap = BitmapFactory.decodeStream(is);is.close();} catch (MalformedURLException e) {// TODO Auto-generated catch blocke.printStackTrace();}catch(IOException e){e.printStackTrace();}return bitmap;}class VisitWebRunnable implements Runnable{@Overridepublic void run() {// TODO Auto-generated method stubString data = getURLResponse("http://www.baidu.com/");resultStr = data;}}class DownImgAsyncTask extends AsyncTask<String, Void, Bitmap>{@Overrideprotected void onPreExecute() {// TODO Auto-generated method stubsuper.onPreExecute();showImageView.setImageBitmap(null);showProgressBar();//顯示進度條提示框}@Overrideprotected Bitmap doInBackground(String... params) {// TODO Auto-generated method stubBitmap b = getImageBitmap(params[0]);return b;}@Overrideprotected void onPostExecute(Bitmap result) {// TODO Auto-generated method stubsuper.onPostExecute(result);if(result!=null){dismissProgressBar();showImageView.setImageBitmap(result);}}}/** * 在母布局中間顯示進度條 */private void showProgressBar(){progressBar = new ProgressBar(this, null, android.R.attr.progressBarStyleLarge);RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);params.addRule(RelativeLayout.CENTER_IN_PARENT,  RelativeLayout.TRUE);progressBar.setVisibility(View.VISIBLE);Context context = getApplicationContext();viewGroup = (ViewGroup)findViewById(R.id.parent_view);//MainActivity.this.addContentView(progressBar, params);viewGroup.addView(progressBar, params);}/** * 隱藏進度條 */private void dismissProgressBar(){if(progressBar != null){progressBar.setVisibility(View.GONE);viewGroup.removeView(progressBar);progressBar = null;}}}

AndroidManifest.xml裡記得加訪問網路的許可權:

<uses-permission android:name="android.permission.INTERNET"/>


注意事項:

1、使用HttpURLConnection的步驟是先執行個體化一個URL對象,通過URL的openConnection執行個體化HttpURLConnection對象。然後設定參數,注意此時並沒有發生串連。真正發生串連是在獲得流時即conn.getInputStream這一句時,這點跟TCP Socket是一樣的。並非阻塞在ServerSocket.accept()而是阻塞在擷取流。所以在擷取流之前應該設定好所有的參數。

2、Get和POST兩種方式訪問伺服器,區別見連結1 連結2

3、[Android4.0後所有網路方面的操作都不能再主線程!!!]在擷取網頁響應字串時本文代碼使用了Thread,在下載圖片時使用了AsyncTask,可以對比其使用的異同。很明顯,AsyncTask更加方面。在onPreExecute和onPostExecute裡可以很方面的做主線程UI的事。

4、在擷取網頁字串時,使用了線程的Thread.join函數,這會使在onClick裡在join處進行阻塞,直到Thread的run執行完才會進行判斷,介面卡死。因此在實際開發中要盡量避免之中,解決方案是使用Thread+Handle的方式,或AsyncTask。實際上後者就是前者的封裝。

5、訪問圖片比較簡單,得到輸入資料流後直接用BitmapFactory解析即可。

6、showProgressBar() 、dismissProgressBar()用來顯示和隱藏下載圖片時的提示框。

運行效果:

初始介面:



按下訪問百度後:



按下下載圖片後:


--------------------------------本文系原創,轉載請註明作者:yanzi1225627

源碼下載連結:http://download.csdn.net/detail/yanzi1225627/7104645


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.