文章来自:http://toolongdidntread.com/android/android-multipart-post-with-progress-bar/


文件上传可能是一个比较耗时的操作,如果为上传操作带上进度提示则可以更好的提高用户体验,最后效果如下图:


android带进度的文件上传


项目源码:http://download.csdn.net/detail/shinay/4965230



这里只贴出代码,可根据实际情况自行修改。


package com.lxb.uploadwithprogress.http;import java.io.File;import org.apache.http.HttpResponse;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpPost;import org.apache.http.entity.mime.content.FileBody;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.protocol.BasicHttpContext;import org.apache.http.protocol.HttpContext;import org.apache.http.util.EntityUtils;import android.app.ProgressDialog;import android.content.Context;import android.os.AsyncTask;import com.lxb.uploadwithprogress.http.CustomMultipartEntity.ProgressListener;public class HttpMultipartPost extends AsyncTask<String, Integer, String> {private Context context;private String filePath;private ProgressDialog pd;private long totalSize;public HttpMultipartPost(Context context, String filePath) {this.context = context;this.filePath = filePath;}@Overrideprotected void onPreExecute() {pd = new ProgressDialog(context);pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);pd.setMessage("Uploading Picture...");pd.setCancelable(false);pd.show();}@Overrideprotected String doInBackground(String... params) {String serverResponse = null;HttpClient httpClient = new DefaultHttpClient();HttpContext httpContext = new BasicHttpContext();HttpPost httpPost = new HttpPost("上传URL, 如:http://www.xx.com/upload.php");try {CustomMultipartEntity multipartContent = new CustomMultipartEntity(new ProgressListener() {@Overridepublic void transferred(long num) {publishProgress((int) ((num / (float) totalSize) * 100));}});// We use FileBody to transfer an imagemultipartContent.addPart("data", new FileBody(new File(filePath)));totalSize = multipartContent.getContentLength();// Send ithttpPost.setEntity(multipartContent);HttpResponse response = httpClient.execute(httpPost, httpContext);serverResponse = EntityUtils.toString(response.getEntity());} catch (Exception e) {e.printStackTrace();}return serverResponse;}@Overrideprotected void onProgressUpdate(Integer... progress) {pd.setProgress((int) (progress[0]));}@Overrideprotected void onPostExecute(String result) {System.out.println("result: " + result);pd.dismiss();}@Overrideprotected void onCancelled() {System.out.println("cancle");}}

package com.lxb.uploadwithprogress.http;import java.io.FilterOutputStream;import java.io.IOException;import java.io.OutputStream;import java.nio.charset.Charset;import org.apache.http.entity.mime.HttpMultipartMode;import org.apache.http.entity.mime.MultipartEntity;public class CustomMultipartEntity extends MultipartEntity {private final ProgressListener listener;public CustomMultipartEntity(final ProgressListener listener) {super();this.listener = listener;}public CustomMultipartEntity(final HttpMultipartMode mode,final ProgressListener listener) {super(mode);this.listener = listener;}public CustomMultipartEntity(HttpMultipartMode mode, final String boundary,final Charset charset, final ProgressListener listener) {super(mode, boundary, charset);this.listener = listener;}@Overridepublic void writeTo(OutputStream outstream) throws IOException {super.writeTo(new CountingOutputStream(outstream, this.listener));}public static interface ProgressListener {void transferred(long num);}public static class CountingOutputStream extends FilterOutputStream {private final ProgressListener listener;private long transferred;public CountingOutputStream(final OutputStream out,final ProgressListener listener) {super(out);this.listener = listener;this.transferred = 0;}public void write(byte[] b, int off, int len) throws IOException {out.write(b, off, len);this.transferred += len;this.listener.transferred(this.transferred);}public void write(int b) throws IOException {out.write(b);this.transferred++;this.listener.transferred(this.transferred);}}}

上面为两个主要的类,下面放一个调用的Activity

package com.lxb.uploadwithprogress;import java.io.File;import com.lxb.uploadwithprogress.http.HttpMultipartPost;import android.app.Activity;import android.content.Context;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;public class MainActivity extends Activity implements OnClickListener {private Context context;private EditText et_filepath;private Button btn_upload;private Button btn_cancle;private HttpMultipartPost post;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);                context = this;                setContentView(R.layout.activity_main);                et_filepath = (EditText) findViewById(R.id.et_filepath);        btn_upload = (Button) findViewById(R.id.btn_upload);        btn_cancle = (Button) findViewById(R.id.btn_cancle);             btn_upload.setOnClickListener(this);        btn_cancle.setOnClickListener(this);    }@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.btn_upload:String filePath = et_filepath.getText().toString();File file = new File(filePath);if (file.exists()) {post = new HttpMultipartPost(context, filePath);post.execute();} else {Toast.makeText(context, "file not exists", Toast.LENGTH_LONG).show();}break;case R.id.btn_cancle:if (post != null) {if (!post.isCancelled()) {post.cancel(true);}}break;}}    }

当然,在Android中使用MultipartEntity类,必须为项目增加相应的jar包,httpmime-4.1.2.jar。


最后放上代码,工程里已包含jar。

地址:

http://download.csdn.net/detail/shinay/4965230






更多相关文章

  1. android 查看解压后的.xml文件代码(axmlprinter2)
  2. 【Android】使用dex2jar 与JD-Gui 反编译APK文件,查看源代码
  3. Android 实现沉浸式只需一行代码
  4. android 文件上传的类--完整 可以直接被调用的
  5. Android中ImageButton自定义按钮的按下效果的代码实现方法,附网上
  6. Android使用okhttp框架实现带参数Get和Post请求(附服务端完整代码
  7. Android ListView 滚动条的设置详解及实例代码

随机推荐

  1. android下进行opencv开发的配置
  2. Ubuntu Lucid(10.04)上安装Google Androi
  3. EXOPlayer居中播放,类似ImageView的CENTER
  4. Android简明开发教程十六:Button 画刷示例
  5. android 保持屏幕长亮及解锁的方法
  6. Android中使用Intent打开本地图库
  7. test
  8. android按钮main.xm_基础篇
  9. Android(安卓)Drawable、Bitmap、byte[]
  10. CollapsingToolbarLayout标准使用方式