当前位置:   article > 正文

安卓AsyncTask异步任务实现文件上传。_安卓asyncmultipartupload

安卓asyncmultipartupload

最近项目中要做一个带进度条的上传文件的功能,学习了AsyncTask,使用起来比较方便,将几个方法实现就行,另外做了一个很简单的demo,希望能对大家有帮助,在程序中设好文件路径和服务器IP即可。

demo运行截图:

AsyncTask是抽象类,子类必须实现抽象方法doInBackground(Params... p),在此方法中实现任务的执行工作,比如联网下载或上传。AsyncTask定义了三种泛型类型Params,Progress和Result。

1、Params 启动任务执行的输入参数,比如HTTP请求的URL,上传文件的路径等;

2、Progress 后台任务执行的百分比;

3、Result 后台执行任务的最终返回结果,比如String。

AsyncTask 的执行分为四个步骤,与前面定义的TaskListener类似。每一步都对应一个回调方法,需要注意的是这些方法不应该由应用程序调用,开发者需要做的就是实现这些方法。在任务的执行过程中,这些方法被自动调用。

1、onPreExecute(), 该方法将在执行实际的后台操作前被UI thread调用。可以在该方法中做一些准备工作,如在界面上显示一个进度条。 

2、doInBackground(Params...), 将在onPreExecute 方法执行后马上执行,该方法运行在后台线程中。这里将主要负责执行那些很耗时的后台计算工作。可以调用 publishProgress方法来更新实时的任务进度。该方法是抽象方法,子类必须实现。 

3、onProgressUpdate(Progress...),在publishProgress方法被调用后,UI thread将调用这个方法从而在界面上展示任务的进展情况,例如通过一个进度条进行展示。 

4、onPostExecute(Result), 在doInBackground 执行完成后,onPostExecute 方法将被UI thread调用,后台的计算结果将通过该方法传递到UI thread.

主进程中使用下面两行开始异步任务:

  1. mTask = new MyTask();
  2. mTask.execute(filePath, url);

doInBackground()函数中,params[0]和params[1]本别对应execute()的第一个和第二个变量。

  1. private class MyTask extends AsyncTask<String, Integer, String>{
  2. @Override
  3. protected void onPostExecute(String result) {
  4. //最终结果的显示
  5. mTvProgress.setText(result);
  6. }
  7. @Override
  8. protected void onPreExecute() {
  9. //开始前的准备工作
  10. mTvProgress.setText("loading...");
  11. }
  12. @Override
  13. protected void onProgressUpdate(Integer... values) {
  14. //显示进度
  15. mPgBar.setProgress(values[0]);
  16. mTvProgress.setText("loading..." + values[0] + "%");
  17. }
  18. @Override
  19. protected String doInBackground(String... params) {
  20. //这里params[0]和params[1]是execute传入的两个参数
  21. String filePath = params[0];
  22. String uploadUrl = params[1];
  23. //下面即手机端上传文件的代码
  24. String end = "\r\n";
  25. String twoHyphens = "--";
  26. String boundary = "******";
  27. try {
  28. URL url = new URL(uploadUrl);
  29. HttpURLConnection httpURLConnection = (HttpURLConnection) url
  30. .openConnection();
  31. httpURLConnection.setDoInput(true);
  32. httpURLConnection.setDoOutput(true);
  33. httpURLConnection.setUseCaches(false);
  34. httpURLConnection.setRequestMethod("POST");
  35. httpURLConnection.setConnectTimeout(6*1000);
  36. httpURLConnection.setRequestProperty("Connection", "Keep-Alive");
  37. httpURLConnection.setRequestProperty("Charset", "UTF-8");
  38. httpURLConnection.setRequestProperty("Content-Type",
  39. "multipart/form-data;boundary=" + boundary);
  40. DataOutputStream dos = new DataOutputStream(httpURLConnection
  41. .getOutputStream());
  42. dos.writeBytes(twoHyphens + boundary + end);
  43. dos
  44. .writeBytes("Content-Disposition: form-data; name=\"file\"; filename=\""
  45. + filePath.substring(filePath.lastIndexOf("/") + 1)
  46. + "\"" + end);
  47. dos.writeBytes(end);
  48. //获取文件总大小
  49. FileInputStream fis = new FileInputStream(filePath);
  50. long total = fis.available();
  51. byte[] buffer = new byte[8192]; // 8k
  52. int count = 0;
  53. int length = 0;
  54. while ((count = fis.read(buffer)) != -1) {
  55. dos.write(buffer, 0, count);
  56. //获取进度,调用publishProgress()
  57. length += count;
  58. publishProgress((int) ((length / (float) total) * 100));
  59. //这里是测试时为了演示进度,休眠500毫秒,正常应去掉
  60. Thread.sleep(500);
  61. }
  62. fis.close();
  63. dos.writeBytes(end);
  64. dos.writeBytes(twoHyphens + boundary + twoHyphens + end);
  65. dos.flush();
  66. InputStream is = httpURLConnection.getInputStream();
  67. InputStreamReader isr = new InputStreamReader(is, "utf-8");
  68. BufferedReader br = new BufferedReader(isr);
  69. @SuppressWarnings("unused")
  70. String result = br.readLine();
  71. dos.close();
  72. is.close();
  73. return "上传成功";
  74. }catch (Exception e) {
  75. e.printStackTrace();
  76. return "上传失败";
  77. }
  78. }
界面中只要一个进度条progressBar 和一个用于显示的TextView即可。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/413613
推荐阅读
相关标签
  

闽ICP备14008679号