andorid使用異步http框架和第三方HttpClinet上傳文件

android使用異步http框架和第三方HttpClinet上傳文件完整源碼

首先我們先來看一下使用第三方HttpClinet的實現方式

這種實現方式需要用到一下3個jar包

commons-fileupload-1.2.1.jar  、  commons-io-1.4.jar  、  commons-httpclient-3.0.1.jar 。

這些jar已經包含在源碼工程裏邊了

關於使用步驟我不多說,代碼裏邊的註釋已經寫明

public void uploadByHttpClient(View view) {
		String path = this.et_path.getText().toString().trim();
		final String url = "http://110.65.99.66:8080/uploadfileServer/UploadFileServlet";
		final File file = new File(path);
		// 先判斷文件是否存在
		if (file.exists() && file.length() > 0) {
			// 網絡訪問爲耗時操作,應該放在子線程中執行
			new Thread() {
				public void run() {

					// 1. 創建第三方HttpClient對象
					HttpClient client = new HttpClient();

					// 2. 創建POST請求對象
					PostMethod post = new PostMethod(url);

					// 3. 設置請求體內容
					try {
						// 參數體
						Part[] ps = { new FilePart("file", file) };
						post.setRequestEntity(new MultipartRequestEntity(ps,
								post.getParams()));

						// 4. 獲取連接器管理對象
						HttpConnectionManager manager = client
								.getHttpConnectionManager();

						// 5. 設置參數提交的等待時間
						manager.getParams().setConnectionTimeout(10000);

						// 6. 執行PostMethod方法
						client.executeMethod(post);

						// 7. 程序執行到這裏,說明成功
						runOnUiThread(new Runnable() {

							@Override
							public void run() {
								Toast.makeText(MainActivity.this, "上傳成功", 0)
										.show();
							}
						});

					} catch (Exception e) {
						e.printStackTrace();
						runOnUiThread(new Runnable() {

							@Override
							public void run() {
								Toast.makeText(MainActivity.this, "上傳失敗", 0)
										.show();
							}
						});
					}
				};
			}.start();
		} else {
			Toast.makeText(this, "文件不存在!", 0).show();
		}
	}

我們再來看看使用異步http框架的實現方式

安卓異步http框架是一個非常精巧的,用於andorid網絡訪問的開源框架。它簡化了android自帶的HttpClient的操作步驟。使用起來相對於上邊的實現方式就簡單多了

安卓異步框架源碼下載

我們先要把下載下來的源碼中library/src目錄下的包給拷到安卓工程下的src目錄

我們看一下核心實現代碼

public void uploadByAsyncHttpClient(View view) {
		String path = this.et_path.getText().toString().trim();
		final String url = "http://110.65.99.66:8080/uploadfileServer/UploadFileServlet";
		final File file = new File(path);
		// 先判斷文件是否存在
		if (file.exists() && file.length() > 0) {

			// 1. 創建AsyncHttpClient對象
			AsyncHttpClient client = new AsyncHttpClient();

			// 2.設置參數體
			RequestParams params = new RequestParams();
			try {
				// 其實這裏的異常不可能出現,因爲上邊已經做了判斷
				params.put("profile_picture", file);
			} catch (FileNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

			// 3.上傳文件
			client.post(url, params, new AsyncHttpResponseHandler() {
				// 上傳成功時回調的方法
				@Override
				public void onSuccess(int statusCode, Header[] headers,
						byte[] responseBody) {
					Toast.makeText(MainActivity.this, "上傳成功!", 0).show();
				}

				// 上傳失敗時回調的方法
				@Override
				public void onFailure(int statusCode, Header[] headers,
						byte[] responseBody, Throwable error) {
					Toast.makeText(MainActivity.this, "上傳失敗!錯誤碼:" + statusCode,
							0).show();
				}

			});
		} else {
			Toast.makeText(this, "文件不存在!", 0).show();
		}
	}



我們來對比一下上邊兩種實現方式

1.從實現步驟來看,第一種用了7步,第二種只用了3步,操作步驟大大簡化

2.第一種方式需要將網絡訪問的代碼放到子線程中去,否則在4.0以上的系統上運行會拋出android.os.NetworkOnMainThreadException,而第二種不用去考慮這個異常

3.因爲將網絡訪問的代碼放到了子線程中去,所以子線程中如果有UI的更新,需要去調用Activity的runOnUiThread()方法

經過對比,第二種方式的優越性就凸顯出來了。所以安卓的文件上傳建議使用異步http框架來實現。


發佈了35 篇原創文章 · 獲贊 4 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章