android 使用OkHttp上传多张图片的实现代码

 更新时间:2018年07月20日 09:47:47   作者:djk_dong  
这篇文章主要介绍了android 使用OkHttp上传多张图片的相关资料,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

简述

还是先来说说为啥用OkHttp作为多图片上传的框架,原因有两点:

1、OkHttp可以作为Volley底层传输协议,速度更快

2、使用Xutils和KJFramework上传图片存在一个小问题,首先,可以上传,并且可以上传多张图片,也可以上传其他的参数,那问题在哪里呢?在后台接受参数时很不灵活,Xutlis及KJFramework使用HashMap来上传每个参数,每一张图片也必须有一个唯一的key,上传一张图片就要定义一个参数来接收,上传两张图片就要定义两个参数来接收,当上传的图片数量不确定的时候,如最多9张或者16张,后台接受图片的时候就要定义9个或者16个,这样的方式很不利于扩展,最好是一个参数接收所有所有图片,不会因为这种不确定的问题,就去定义很多的参数,然后一个个判断是否存在。OkHttp底层则不是这样,大概的浏览了下源码,底层接收参数的时候使用的是List,只要使用相同的key就可以添加到同一个list,而后台只需要根据这一个key不断遍历就行,无论多少张图片都无障碍,也没有了后顾之忧。

核心代码实现

//参数类型
private static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");
//创建OkHttpClient实例
private final OkHttpClient client = new OkHttpClient();
MultipartBuilder builder = new MultipartBuilder().type(MultipartBuilder.FORM);
//遍历map中所有参数到builder
for (String key : map.keySet()) {
      builder.addFormDataPart(key, map.get(key));
    }
  //遍历paths中所有图片绝对路径到builder,并约定key如“upload”作为后台接受多张图片的key
    for (String path : paths) {
      builder.addFormDataPart("upload", null, RequestBody.create(MEDIA_TYPE_PNG, new File(path)));
    }
   //构建请求体
    RequestBody requestBody = builder.build();
 //构建请求
 Request request = new Request.Builder()
        .url(url)//地址
        .post(requestBody)//添加请求体
        .build(); 
//发送异步请求,同步会报错,Android4.0以后禁止在主线程中进行耗时操作
client.newCall(request).enqueue(new Callback() {
      @Override
      public void onFailure(Request request, IOException e) {
        System.out.println("request = " + request.urlString());
        System.out.println("e.getLocalizedMessage() = " + e.getLocalizedMessage());
      }
      @Override
      public void onResponse(Response response) throws IOException {
        //看清楚是response.body().string()不是response.body().toString()
             System.out.println("response = " + response.body().string());
             }
    });

基本实现思路就是这样了,更多请参考OkHttp文档,项目中我准备完全除去Xutils的其他部分,如文件下载部分。

知识拓展

List与HashMap区别

List可以保存多个相同或者不同的元素

HashMap则是以键值对(key-value)保存元素,当添加多个相同key的元素,之前的元素会被覆盖

这一点至关重要,Xutils以及KJFframework的设计都没有考虑到这一点,看似很好用,但当我要添加多张相同或者不同的图片文件作为参数传输给后台,我却需要定义很多的key,不然无论添加多少张图片结果却只能是最后一张。

总结

以上所述是小编给大家介绍的android 使用OkHttp上传多张图片的实现代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • Android View 测量流程(Measure)全面解析

    Android View 测量流程(Measure)全面解析

    这篇文章主要为大家全面解析了Android View 测量流程Measure,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-02-02
  • Android实现动态高斯模糊效果示例代码

    Android实现动态高斯模糊效果示例代码

    这篇文章主要介绍了Android快速实现动态模糊效果示例代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-01-01
  • Android View 事件防抖的两种方案

    Android View 事件防抖的两种方案

    这篇文章主要介绍了Android View 事件防抖的两种方案,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下
    2021-04-04
  • Android自定义View实现投票进度条

    Android自定义View实现投票进度条

    这篇文章主要为大家详细介绍了Android自定义View实现投票进度条,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • Android实现九宫格横向左右滑动

    Android实现九宫格横向左右滑动

    这篇文章主要为大家详细介绍了Android实现九宫格横向左右滑动,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • Android自定义RecyclerView实现不固定刻度的刻度尺

    Android自定义RecyclerView实现不固定刻度的刻度尺

    这篇文章主要为大家详细介绍了Android自定义RecyclerView实现不固定刻度的刻度尺,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • android屏幕圆角实现方法的示例代码

    android屏幕圆角实现方法的示例代码

    本篇文章主要介绍了android屏幕圆角实现方法的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)

    Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)

    Android中Textview和图片同行显示,文字超出用省略号显示,图片自动靠右边。看到这个问题本来认为是一个很正常的需求,看起来很简单,但是做起来却遇到了很蛋疼的问题,怎么搞的都不行,堵了很长时间,下面说一下解决的方案,希望遇到这样问题的朋友可以使用。
    2016-12-12
  • Flutter实现仿微信分享功能的示例代码

    Flutter实现仿微信分享功能的示例代码

    Flutter 用来快速开发 Android iOS平台应用,在Flutter 中,通过 fluwx或者fluwx_no_pay 插件可以实现微信分享功能,本文将具体介绍实现的示例代码,需要的可以参考一下
    2022-01-01
  • Android SwipeRefreshLayout下拉刷新组件示例

    Android SwipeRefreshLayout下拉刷新组件示例

    SwipeRefrshLayout是Google官方更新的一个Widget,可以实现下拉刷新的效果。本文主要介绍了Android之SwipeRefreshLayout下拉刷新组件示例,有兴趣的可以了解一下。
    2017-02-02

最新评论