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框架来实现。