Android Asynchronous Http Client 开发实例——上传文件

来源:互联网 发布:网络模拟软件 编辑:程序博客网 时间:2024/05/29 02:12

一、背景

之前在Android中写过用Http上传文件到server端的代码,涉及到很多基础的步骤,包括设置entity、发送post请求等等细节。但是后来看到了Android Asynchronous Http Client 这个功能强大的库,就大大简化了代码,直接使用其中的接口就可以很方便的发送get、post等等request。

该库的详细讲解和使用方法可以参考链接:http://loopj.com/android-async-http/


二、核心代码

我用这个库实现简易的文件上传功能的Android应用。核心代码如下所示:


progressBar.setProgress(0);AsyncHttpClient client = new AsyncHttpClient();for(int i=0; i<8; i++) {File myFile = new File(imagesUrl[i]);RequestParams para = new RequestParams();try {<span style="white-space:pre"></span>para.put("image", myFile);<span style="white-space:pre"></span>client.post(url, para, new AsyncHttpResponseHandler() {<span style="white-space:pre"></span>@Override<span style="white-space:pre"></span>public void onFailure(int arg0, Header[] arg1, byte[] arg2, Throwable arg3) {<span style="white-space:pre"></span>// TODO Auto-generated method stub<span style="white-space:pre"></span>if(arg2.length>0 && arg2!=null) {<span style="white-space:pre"></span>String response = new String(arg2);<span style="white-space:pre"></span>Log.i(TAG, response);<span style="white-space:pre"></span>}<span style="white-space:pre"></span>}<span style="white-space:pre"></span>@Override<span style="white-space:pre"></span>public void onSuccess(int arg0, Header[] arg1, byte[] arg2) {<span style="white-space:pre"></span>// TODO Auto-generated method stub<span style="white-space:pre"></span>String response = new String(arg2);<span style="white-space:pre"></span>Log.i(TAG, response);<span style="white-space:pre"></span>cnt ++;<span style="white-space:pre"></span>progressBar.setProgress((int)(100 * cnt/(float)8 ));<span style="white-space:pre"></span>}<span style="white-space:pre"></span>});} catch(FileNotFoundException e) {Log.d(TAG, "File not found!!!" + imagesUrl[i]);}

首先使用库中的类AsyncHttpClient创建一个client。之后我使用一个循环向服务器发送8次post请求分别来传输八张图片。为了能了解传输的进度,我在每个请求成功接收后的处理函数onSuccess()中更新ProgressBar。

另外,其实也可以将8张图片的上传用一个Http request来实现,只需如下所示,构建一个File类型的数组,将这个数组作为参数存取RequestParams即可。

File[] files = {new File(imagesUrl[0]), new File(imagesUrl[1]), new File(imagesUrl[2]), new File(imagesUrl[3]),                        new File(imagesUrl[4]), new File(imagesUrl[5]), new File(imagesUrl[6]), new File(imagesUrl[7])};params.put("images[]", files);

在服务器端,我用一个php文件来负责接收上传的文件。该php文件的URL地址即是上述代码片中的url字符串的值。


三、注意事项

我在实现的过程中遇到了一个错误。一开始,我new了一个thread来执行上述核心代码,发现总是报错。之后我又在AsyncTask的doInBackground()函数中执行该代码,还是有错。最后将它置于Activity中才可行。我总结知道这些操作只能在UI thread中执行。因为该库已经将Http请求写成异步处理的模式,所以本身不会阻塞当前UI thread的运行,所以也无需画蛇添足去new一个线程,或者用AsyncTask。类似的,我联想到Android中的Toast也是必须在UI线程中被执行,否则也会有问题。


0 0
原创粉丝点击