移動測試之HttpClient網絡訪問

一、HttpClient網絡訪問:
(一)、簡介:
1、Apache組織提供了HttpClient項目,可以實現網絡訪問。在Android中,成功集成了HttpClient,所以在Android中可以直接使用HttpClient訪問網絡。
2、與HttpURLConnection相比,HttpClient將前者中的輸入、輸出流操作,統一封裝成HttpGet、HttpPost、HttpRequest類。

  • HttpClient:網絡連接對象;
  • HttpGet:代表發送GET請求;
  • HttpPost:代表發送POST請求;
  • HttpResponse:代表處理服務器響應的對象。
  • HttpEntity對象:該對象中包含了服務器所有的返回內容。
    3、使用步驟:(六部曲)【重點】
    1.創建HttpClient對象:通過實例化DefaultHttpClient獲得;
    2.創建HttpGet或HttpPost對象:通過實例化 HttpGet或HttpPost 獲得,而構造方法的參數是urlstring(即需要訪問的網絡url地址)。也可以通過調用setParams()方法來添加請求參數;
    3.調用HttpClient對象的execute()方法,參數是剛纔創建的 HttpGet或HttpPost對象 ,返回值是HttpResponse對象;
    4.通過response對象中的getStatusLine()方法和getStatusCode()方法獲取服務器響應狀態是否是200。
    5.調用 HttpResponse對象的getEntity()方法,返回HttpEntity對象。而該對象中包含了服務器所有的返回內容。
    6.藉助EntityUtils的toString()方法或toByteArray()對 HttpEntity對象進行處理,也可以通過IO流對 HttpEntity對象進行操作。

(二)、封裝HttpClientHelper工具類:
public class HttpClientHelper {
public static HttpClient checkNetwork(String url) {
HttpClient httpClient = new DefaultHttpClient();
HttpGet request = new HttpGet(url);
HttpResponse httpResponse = null;
try {
httpResponse = httpClient.execute(request);
if (httpResponse.getStatusLine().getStatusCode() == 200) {
return httpClient;
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}

/
作用:實現網絡訪問文件,將獲取到數據儲存在文件流中br/>

  • @param url
    :訪問網絡的url地址
    @return inputstream
    */
    public static InputStream loadFileFromURL(String url) {
    HttpClient httpClient = new DefaultHttpClient();
    HttpGet requestGet = new HttpGet(url);
    HttpResponse httpResponse;
    try {
    httpResponse = httpClient.execute(requestGet);
    if (httpResponse.getStatusLine().getStatusCode() == 200) {
    HttpEntity entity = httpResponse.getEntity();
    return entity.getContent();
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    return null;
    }

/
作用:實現網絡訪問文件,將獲取到的數據存在字節數組中br/>

  • @param url
    :訪問網絡的url地址
    @return byte[]
    */
    public static byte[] loadByteFromURL(String url) {
    HttpClient httpClient = new DefaultHttpClient();
    HttpGet requestGet = new HttpGet(url);
    try {
    HttpResponse httpResponse = httpClient.execute(requestGet);
    if (httpResponse.getStatusLine().getStatusCode() == 200) {
    HttpEntity httpEntity = httpResponse.getEntity();
    return EntityUtils.toByteArray(httpEntity);
    }
    } catch (Exception e) {
    e.printStackTrace();
    System.out.println("====>" + e.toString());
    }
    return null;
    }

/
作用:實現網絡訪問文件,返回字符串br/>

  • @param url
    :訪問網絡的url地址
    @return String
    */
    public static String loadTextFromURL(String url) {
    HttpClient httpClient = new DefaultHttpClient();
    HttpGet requestGet = new HttpGet(url);
    try {
    HttpResponse httpResponse = httpClient.execute(requestGet);
    if (httpResponse.getStatusLine().getStatusCode() == 200) {
    HttpEntity httpEntity = httpResponse.getEntity();
    return EntityUtils.toString(httpEntity, "utf-8");
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    return null;
    }

/
作用:實現網絡訪問文件,先給服務器通過“GET”方式提交數據,再返回相應的數據br/>

  • @param url
    :訪問網絡的url地址
    @param params
    String url:訪問url時,需要傳遞給服務器的參數。
    第二個參數格式爲:username=wangxiangjun&password=123456br/> @return byte[]
    /
    public static byte[] doGetSubmit(String url, String params) {
    HttpClient httpClient = new DefaultHttpClient();
    HttpGet requestGet = new HttpGet(url + "?" + params);
    try {
    HttpResponse httpResponse = httpClient.execute(requestGet);
    if (httpResponse.getStatusLine().getStatusCode() == 200) {
    HttpEntity httpEntity = httpResponse.getEntity();
    return EntityUtils.toByteArray(httpEntity);
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    return null;
    }

/
作用:實現網絡訪問文件,先給服務器通過“POST”方式提交數據,再返回相應的數據br/>

  • @param url
    :訪問網絡的url地址
    @param params
    String url:訪問url時,需要傳遞給服務器的參數。 第二個參數爲:List<NameValuePair>
    @return byte[]
    */
    public static byte[] doPostSubmit(String url, List<NameValuePair> params) {
    HttpClient httpClient = new DefaultHttpClient();
    HttpPost requestPost = new HttpPost(url);
    try {
    requestPost.setEntity(new UrlEncodedFormEntity(params, "utf-8"));
    HttpResponse httpResponse = httpClient.execute(requestPost);
    if (httpResponse.getStatusLine().getStatusCode() == 200) {
    HttpEntity httpEntity = httpResponse.getEntity();
    return EntityUtils.toByteArray(httpEntity);
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    return null;
    }

/
作用:實現網絡訪問文件,先給服務器通過“POST”方式提交數據,再返回相應的數據br/>

  • @param url
    :訪問網絡的url地址
    @param params
    String url:訪問url時,需要傳遞給服務器的參數。 Map<String , Object>
    @return byte[]
    */
    public static byte[] doPostSubmit(String url, Map<String, Object> params) {
    HttpClient httpClient = new DefaultHttpClient();
    HttpPost requestPost = new HttpPost(url);

List<BasicNameValuePair> parameters = new ArrayList<BasicNameValuePair>();
try {
if (params != null) {
for (Map.Entry<String, Object> entry : params.entrySet()) {
String key = entry.getKey();
String value = entry.getValue().toString();
BasicNameValuePair nameValuePair = new BasicNameValuePair(
key, value);
parameters.add(nameValuePair);
}
}
requestPost
.setEntity(new UrlEncodedFormEntity(parameters, "utf-8"));
HttpResponse httpResponse = httpClient.execute(requestPost);

if (httpResponse.getStatusLine().getStatusCode() == 200) {
HttpEntity httpEntity = httpResponse.getEntity();
return EntityUtils.toByteArray(httpEntity);
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}

【複習:】POST和GET在表單提交時的區別:【重點】
  Post傳遞必須依賴於表單,傳值的內容沒有大小限制,傳值內容不會在地址欄顯示,比 Get 傳值安全;
  Get傳值的內容會通過地址欄顯示,而地址欄長度有最大長度限制,因爲 Get 傳參內容不可以過長,當超過某個長度後會自動裁切掉多餘內容。比起 Post 傳參, Get 傳參不夠安全。但是 Get 傳參可以通過表單,也可以不通過表單,直接通過地址欄傳參。因此 Get 傳參更靈活。

二、SoundPool聲音池:
(一)、使用步驟:
1、創建SoundPool對象;
SoundPool pool = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);
2、加載音效;
pool.load(this, R.raw.音頻文件名, 1);
3、播放音效。
pool.play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate) ;

(二)、示例代碼:
public class MainActivity extends Activity {
private SoundPool pool = null;
private HashMap<Integer, Integer> poolMap = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 調用初始化聲音池
initSoundPool();
}

/*

初始化聲音池 pool = new SoundPool(5, // maxStreams參數,該參數爲設置同時能夠播放多少音效
AudioManager.STREAM_MUSIC, //
streamType參數,該參數設置音頻類型,在遊戲中通常設置爲:STREAM_MUSIC //
srcQuality參數,該參數設置音頻文件的質量,0爲默認值。
*/
public void initSoundPool() {
pool = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);
poolMap = new HashMap<Integer, Integer>();
poolMap.put(1, pool.load(this, R.raw.ding, 1));
poolMap.put(2, pool.load(this, R.raw.ringin, 1));
}

/*

播放聲音,參數sound是播放音效的id,參數number是播放音效的次數 pool.play(poolMap.get(sound), //
播放的音樂id volumnRatio, // 左聲道音量 volumnRatio, // 右聲道音量 1, // 優先級,0爲最低
number, // 循環次數,0無不循環,-1無永遠循環 1 // 回放速度 ,該值在0.5-2.0之間,1爲正常速度
*/
public void playSound(int sound, int number) {
// 實例化AudioManager對象
AudioManager manager = (AudioManager) this
.getSystemService(this.AUDIO_SERVICE);
// 返回當前AudioManager對象的最大音量值
float audioMaxVolumn = manager
.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
// 返回當前AudioManager對象的音量值
float audioCurrentVolumn = manager
.getStreamVolume(AudioManager.STREAM_MUSIC);
float volumnRatio = audioCurrentVolumn / audioMaxVolumn;
pool.play(poolMap.get(sound), // 播放的音樂id
volumnRatio, // 左聲道音量
volumnRatio, // 右聲道音量
1, // 優先級,0爲最低
number, // 循環次數,0:不循環,-1:永遠循環
1 // 回放速度 ,該值在0.5-2.0之間,1爲正常速度
);
}

public void clickButton(View view) {
switch (view.getId()) {
case R.id.button_main_play1:
playSound(1, 0);
break;
case R.id.button_main_play2:
playSound(2, 0);
default:
break;
}
}
}

三、學習Android的軟件Android manual的思考:
(一)、解壓android_manual.apk,發現res目錄下有個目錄raw,其中存放的就是該應用的數據庫文件。
1、raw目錄是什麼?
2、如何訪問raw目錄下的數據庫呢?

(二)、回顧資源訪問:
1.字符串資源文件:string
2.顏色資源、尺寸資源文件 :color、dimen
3.佈局資源: layout
4.數組資源: string-array 、 integer-array
5.圖片資源: drawable
6.樣式和主題資源:style、theme
7.菜單資源: menu
8.原始XML資源: xml
9.原生文件資源: raw
【備註:】raw目錄下主要放置的資源有音頻、視頻等文件。raw目錄下的文件會在R.java中被註冊。
如何訪問raw目錄下的文件?
InputStream is = getResources().openRawResource(R.raw.文件名);

【備註:】
Android manual這個app中將數據庫放在raw中,那麼該數據庫將如何訪問?我們發現,當安裝完該apk後,會看到在sdcard中產生一個androidmanual目錄,該目錄下存放着該app的數據庫。雖然raw中的數據庫是沒有辦法讓SQLiteDatabase訪問,而如果放在sdcard上,只要知道路徑,則可以訪問。所以如果我們要模仿製作一個Android manual
項目,那麼就可以藉助getResources().openRawResource(R.raw.文件名)產生的輸入流,將文件保存在sdcard的某個目錄下。這樣SQLiteDatabase就可以調用openDatabase()方法來訪問數據庫了。特別提醒的是:要注意openDatabase()方法的第三個參數flag。如果選擇不正確,則無法正常訪問數據庫。(應該是哪個常量值呢?請同學們先查看API,自己尋找答案。)

四、assets目錄中的圖片如何訪問?
(一)、運用場景:
當使用WebView控件的時候,可以比較方便地訪問assets目錄中的文件了。文件目錄是:file:///android_asset/文件名.文件後綴

(二)、示例代碼:(WebView中載入html字符串,顯示assests目錄下的圖片)
public class MainActivity extends Activity {
private WebView webView_main;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

webView_main = (WebView) findViewById(R.id.webView_main);

// 設置瀏覽器支持。這樣webview可以處理各種通知和請求事件。
// 如果不使用該句代碼,在點擊超鏈地址後,會跳出程序,而彈出瀏覽器訪問網頁。
webView_main.setWebChromeClient(new WebChromeClient());
webView_main.setWebViewClient(new WebViewClient());

WebSettings webSetting = webView_main.getSettings();
webSetting.setJavaScriptEnabled(true); // 設置支持javascript腳本
webSetting.setAllowFileAccess(true); // 允許訪問文件
webSetting.setBuiltInZoomControls(true); // 設置顯示縮放按鈕
webSetting.setSupportZoom(true); // 支持縮放

String data = "<form method='post' action=''>用戶名:<input type='text' name='username'><input type='submit' value='提交'></form>";
StringBuilder sb = new StringBuilder();
sb.append("<form method='get' action='http://192.168.104.160:8080/AndroidServer/LoginServlet'&gt;;");
sb.append("用戶名:<input type='text' name='username'><br>");
sb.append("密碼:<input type='password' name='password'><br>");
sb.append("<input type='submit' value='登錄'>");
sb.append("</form>");
sb.append("<img src='file:///android_asset/android.jpg' width='300dp'>");

// webview組件能加載包含html代碼的字符串,並且能執行html。爲了防止亂碼,使用loadDataWithBaseURL()方法。而不用loadData()方法。
// loadDataWithBaseURL()方法中的第二個參數時MIME,詳見當天的課堂筆記。
webView_main.loadDataWithBaseURL(null, sb.toString(), "text/html",
"utf-8", null);
}

}

(三)、示例代碼2:(ImageView中加載assets目錄下的圖片)
private ImageView imageView_main;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

imageView_main = (ImageView) findViewById(R.id.imageView_main);
try {
InputStream is = this.getAssets().open("abc.jpg");
imageView_main.setImageBitmap(BitmapFactory.decodeStream(is));
} catch (IOException e) {
e.printStackTrace();
}
}

編輯:千鋒軟件測試

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章