標籤:android httpurlconnection 查看網狀圖片 查看網路源碼
1.首先,來介紹一下HttpURLConnection類,HttpURLConnection類位於java.net包中,用於發送HTTP請求和擷取HTTP響應。由於此類是抽象類別,不能直接執行個體化對象,所以需要使用URL的openConnection()方法來獲得。
例如,要建立一個http://www.baidu.com 網站對應的HttpURLConnection對象,可以使用下列代碼:
URL url=new URL("http://www.baidu.com");HttpURLConnection urlConnection=(HttpURLConnection)url.openConnection(); 註:上述代碼通過openConnection()方法建立的HttpURLConnection對象,並沒有真正執行串連操作,只是建立了一個新的執行個體,在進行串連前,還可以設定一些屬性。
例如,連線逾時的時間和請求方式等,代碼如下:
urlConnection.setConnectTimeout(5000);//設定連線逾時時間為5秒urlConnection.setRequestMethod("GET");//設定串連的方式為get方式
建立了HttpURLConnection對象後,就可以使用該對象發送HTTP請求了。
2.在編寫我們的Android項目之前,先做下面幾個步驟:
(1).開啟Tomcat伺服器,如所示:
(2).把我們所需要的Web項目部署到Tomcat伺服器上,也可以將我們Web項目複製到tomcat伺服器的安裝目錄下的webapps目錄底下,即可,如所示:
(3).這個Android項目要訪問的為music項目,開啟此項目,如所示:
其中我們Android要訪問的為image檔案夾下的一張圖片,和music項目底下的index.jsp檔案,即查看此網狀圖片和網路源碼。
(4).最後,我們必須要知道當前網路的IP地址,因為我們訪問的為Windows系統下的tomcat伺服器的Web項目,而Android系統的核心為Linux,系統不一樣,所以我們在windows系統下訪問Web‘項目,可以直接輸入http://localhost:8083/music/index.jsp 或者http://127.0.0.1:8083/music/index.jsp 以及http://192.168.91.1:8083/music/index.jsp ,而Android訪問Web項目只可以通過http://192.168.91.1:8083/music/index.jsp 所以,先查看我們的IP地址,開啟命令列視窗,輸入ipconfig命令,即可查看,如所示:
其中查看到的IPv4地址即為IP地址。
3.接下來就可以編寫我們的Android項目了,此Android項目用來查看網狀圖片和網路源碼,建立Android項目,項目名為android_net,主要項目結構如下:
(1).首先,開啟我們的activity_main.xml布局檔案,此布局檔案只放置兩個按鈕,點擊不同的按鈕跳轉到不同的Activity,代碼如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:id="@+id/net_image" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="查看網狀圖片" /> <Button android:id="@+id/net_code" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="查看網路源碼" /></LinearLayout>
(2).開啟MainActivity.java檔案,此類用來點擊按鈕跳轉不同的Activity,代碼如下:
package com.android.android_net;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class MainActivity extends Activity {private Button net_image,net_code;//聲明Button對象@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);/* 擷取布局管理器中的兩個Button控制項 */net_image=(Button)findViewById(R.id.net_image);net_code=(Button)findViewById(R.id.net_code);/* 分別添加按鈕點擊監聽事件 */net_image.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Intent intent=new Intent(MainActivity.this,ShowNetImageActivity.class);//執行個體化Intent對象startActivity(intent);//開啟此Activity,跳轉到ShowNetImageActivity類}});net_code.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Intent intent=new Intent(MainActivity.this,ShowNetCodeActivity.class);//執行個體化Intent對象startActivity(intent);//開啟此Activity,跳轉到ShowNetCodeActivity類}});}}
(3).接下來在layout目錄下建立一個activity_image.xml檔案,用來顯示網路的圖片,主要代碼如下:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="網狀圖片路徑" android:padding="5dp"/><EditText android:id="@+id/imagePath_et" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="http://192.168.91.1:8083/music/image/mm4.jpg"/><Button android:id="@+id/show_netimage" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="查看網狀圖片"/><ImageView android:id="@+id/imageView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_launcher"/></LinearLayout>
(4).接著,在com.android.android_net包下建立一個ShowNetImageActivity類,其中開啟了一個新線程來調用ImageService的getImage()方法,這樣才能避免網路主線程異常,代碼如下:
package com.android.android_net;import com.android.service.ImageService;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.ImageView;public class ShowNetImageActivity extends Activity {private EditText imagePath_et;//聲明EditText對象,即圖片路徑輸入框private Button show_netimage;//聲明Button對象private ImageView imageView;//聲明ImageView對象@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.activity_image);/* 擷取布局管理器的各個控制項 */imagePath_et=(EditText)findViewById(R.id.imagePath_et);show_netimage=(Button)findViewById(R.id.show_netimage);imageView=(ImageView)findViewById(R.id.imageView);//為按鈕點擊添加事件監聽器show_netimage.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubfinal String imagePath=imagePath_et.getText().toString();//擷取圖片路徑//建立一個線程new Thread(new Runnable(){@Overridepublic void run() {// TODO Auto-generated method stubtry {byte[] data=ImageService.getImage(imagePath);//調用ImageService類的getImage()方法,返回位元組數組final Bitmap bitmap=BitmapFactory.decodeByteArray(data, 0, data.length);//建立一個Bitmap對象imageView.post(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubimageView.setImageBitmap(bitmap);//設定顯示的圖片}});} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}).start();//開啟線程}});}}
(5).接著,主要的一個ImageService類,在com.android.service包下,用來返回網狀圖片的資料,代碼如下:
package com.android.service;import java.io.ByteArrayOutputStream;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.URL;public class ImageService {public static byte[] getImage(String imagePath) throws Exception {// TODO Auto-generated method stubURL url=new URL(imagePath);//執行個體化URL對象urlHttpURLConnection connection=(HttpURLConnection) url.openConnection();//執行個體化HttpURLConnection對象connectionconnection.setConnectTimeout(5000);//設定連線逾時時間為5秒connection.setRequestMethod("GET");//佈建要求方法為get方式int code=connection.getResponseCode();//擷取狀態代碼//如果狀態代碼請求成功的話,即code等於HttpURLConnection.HTTP_OK,也可以寫成code==200if(code==HttpURLConnection.HTTP_OK){InputStream inputStream=connection.getInputStream();//獲得輸入資料流,返回一個InputStream對象ByteArrayOutputStream outputStream=new ByteArrayOutputStream();//執行個體化一個位元組數組輸出輸入資料流對象byte[] buffer=new byte[1024];//執行個體化一個位元組數組對象int len=0;//定義一個變數,初始值為0//當擷取到的輸入資料流有資料時,迴圈寫入資料while((len=inputStream.read(buffer))!=-1){outputStream.write(buffer, 0, len);//寫入資料}inputStream.close();//關閉輸入資料流return outputStream.toByteArray();//返回資料位元組數組}return null;}}
(6).接著在layout目錄下建立一個activity_code.xml檔案,用來顯示網路源碼,代碼如下:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="5dp" android:text="網狀圖片路徑:" /> <EditText android:id="@+id/codePath_et" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="http://192.168.91.1:8083/music/index.jsp" /> <Button android:id="@+id/show_netcode" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="查看網路源碼" /> <ScrollView android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/textView" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="哈哈..." /> </ScrollView></LinearLayout>
(7).在com.android.android_net包下建立一個ShowNetCodeActivity類,其中開啟了一個新線程,使用Handler訊息機制來顯示我們的網路源碼,其中建立線程中調用了CodeService類的getCode()方法,來擷取網路源碼,ShowNetCodeActivity類代碼如下:
package com.android.android_net;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;import com.android.service.CodeService;public class ShowNetCodeActivity extends Activity {private EditText codePath_et;//聲明EditText對象private Button show_netcode;//聲明Button對象private TextView textView;//聲明textView對象private String result="";//初始化一個空的String類型變數private Handler handler;//聲明一個Handler對象@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.activity_code);/* 擷取布局管理器中的各個控制項 */codePath_et=(EditText)findViewById(R.id.codePath_et);show_netcode=(Button)findViewById(R.id.show_netcode);textView=(TextView)findViewById(R.id.textView);//為按鈕點擊添加監聽事件show_netcode.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {final String codePath=codePath_et.getText().toString();//擷取網路源碼的路徑//建立一個線程new Thread(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubtry {result=CodeService.getCode(codePath);//調用CodeSErvice類的getCode方法,返回字串資料Message msg=handler.obtainMessage();//通過handler對象獲得Message訊息handler.sendMessage(msg);//發送訊息} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}).start();//開啟一個線程//執行個體化一個Handler對象handler=new Handler(){@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stubif(result!=null){textView.setText(result);//設定文本視圖顯示的文本}super.handleMessage(msg);}};}});}}
(8).下面,在com.android.service包下建立一個CodeService類,用來擷取網路源碼,代碼如下:
package com.android.service;import java.io.ByteArrayOutputStream;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.URL;public class CodeService {public static String getCode(String codePath) throws Exception {// TODO Auto-generated method stubURL url=new URL(codePath);//執行個體化一個URL對象HttpURLConnection connection=(HttpURLConnection) url.openConnection();//執行個體化一個HttpURLConnection對象connection.setConnectTimeout(5000);//設定連線逾時時間為5秒connection.setRequestMethod("GET");//設定串連的方式為get方式int code=connection.getResponseCode();//擷取狀態代碼//如果請求成功的話if(code==200){InputStream inputStream=connection.getInputStream();//擷取輸入資料流,返回InputStream對象ByteArrayOutputStream outputStream=new ByteArrayOutputStream();//執行個體化一個ByteArrayOutputStream對象byte[] buffer=new byte[1024];//執行個體化一個位元組數組對象int len=0;//定義一個變數,初始值為0//當擷取到的輸入資料流有資料時,迴圈寫入資料while((len=inputStream.read(buffer))!=-1){outputStream.write(buffer, 0, len);//寫入資料}inputStream.close();//關閉輸入資料流byte[] data=outputStream.toByteArray();//獲得位元組數組String result=new String(data, "UTF-8");//通過擷取到的位元組數組資料執行個體化一個String對象,編碼格式為UTF-8return result;//返回寫入的資料}return null;}}
(9).最後,千萬要記得在AndroidManifest.xml檔案添加訪問網路的許可權,以及那兩個Activity,代碼如下:
添加訪問網路許可權:
<uses-permission android:name="android.permission.INTERNET"/>
聲明另外兩個activity:
<activity android:name="com.android.android_net.ShowNetImageActivity"/> <activity android:name="com.android.android_net.ShowNetCodeActivity"/>
4.部署我們的項目到Android模擬器上,效果如下:
(1).點擊查看網狀圖片按鈕,跳轉到ShowNetImageActivity,如所示:
點擊的按鈕,如:
擷取到tomcat伺服器上的圖片。
(2).如果點擊剛開始啟動並執行那個查看網路源碼的按鈕,將跳轉到ShowNetCodeActivity,如所示:
點擊網路源碼按鈕,如:
這樣便擷取到網路的源碼了。
註:其中要注意的一點是 我們訪問網路檔案的源碼時,要注意網路jsp檔案和擷取到的字串的編碼問題,否則會出現中文亂碼問題。
5.以上內容僅供大家學習參考,寫得不好,請見諒,如有錯誤,請指出,謝謝!
源碼:http://download.csdn.net/download/u012561176/9054209
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
Android之使用HttpURLConnection類查看網狀圖片以及網路源碼