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框架來實現。