okhttp2 和 okhttp 3上传单张或者多张图片的差异( 更好地理解使用okhttp )

原创 2016年10月10日 10:34:12

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

OKHTTP  2   核心代码实现

//参数类型
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,不然无论添加多少张图片结果却只能是最后一张。

OKHTTP2核心代码转载地址为http://www.ithao123.cn/content-8668449.html

***************************************************************************

接下来就是OKHTTP3 核心代码:


rivate static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");

private final OkHttpClient client = new OkHttpClient();
private void uploadImg() {

        // mImgUrls为存放图片的url集合
        MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM);
        for (int i = 0; i <mImgUrls.size() ; i++) {
            File f=new File(mImgUrls.get(i));
            if (f!=null) {
                builder.addFormDataPart("img", f.getName(), RequestBody.create(MEDIA_TYPE_PNG, f));
            }
        }
           //添加其它信息
//        builder.addFormDataPart("time",takePicTime);
//        builder.addFormDataPart("mapX", SharedInfoUtils.getLongitude());
//        builder.addFormDataPart("mapY",SharedInfoUtils.getLatitude());
//        builder.addFormDataPart("name",SharedInfoUtils.getUserName());


        MultipartBody requestBody = builder.build();
        //构建请求
        Request request = new Request.Builder()
                .url(Constant.BASE_URL)//地址
                .post(requestBody)//添加请求体
                .build();

        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                
                System.out.println("上传失败:e.getLocalizedMessage() = " + e.getLocalizedMessage());
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                
                System.out.println("上传照片成功:response = " + response.body().string());
                ToastCustom.makeText(PictureListActivity.this, "上传成功", Toast.LENGTH_LONG).show();
              

            }
        });

    }
okhttp  3代码转载地址为http://blog.csdn.net/sanyang730/article/details/51317083

Volley-XUtils-OkHttp三种方式实现单张多张图片上传

OkHttp可以作为Volley底层传输协议,速度更快,传大量图片建议使用。OkHttp更多功能请看 OkHttp的使用 xUtils 支持大文件上传,更全面的http请求协议支持(10种谓词),...
  • DickyQie
  • DickyQie
  • 2016年10月24日 11:33
  • 2104

android 使用OkHttp上传多张图片

简述还是先来说说为啥用OkHttp作为多图片上传的框架,原因有两点: 1、OkHttp可以作为Volley底层传输协议,速度更快 2、使用Xutils和KJFramework上传图片存在一个小问题...
  • djk_dong
  • djk_dong
  • 2015年08月22日 17:40
  • 22289

Android OkHttp3 上传多张图片

经过实践,android与php交互,已经成功搞定! 一、Android 端 /** * 上传文件及参数 */ private void sendMultipart(...
  • moniteryao
  • moniteryao
  • 2016年09月29日 12:51
  • 7811

android 使用OkHttp上传多张图片

简述 还是先来说说为啥用OkHttp作为多图片上传的框架,原因有两点: 1、OkHttp可以作为Volley底层传输协议,速度更快 2、使用Xutils和KJFramework上传图片存在一...
  • u010741768
  • u010741768
  • 2016年04月11日 21:14
  • 1399

android 头像利用okhttp上传到服务器部分----萌新成长之路

上一篇博客我们成功完成了从照相机拍摄和相册里选择图片并在app中显示出来。我们也完成了初步的裁剪。今天我们来把用户的数据上传到服务器,模拟一个用户在游戏内部修改自己头像,点击确定以后的保存过程。...
  • q1052196521
  • q1052196521
  • 2017年03月21日 16:26
  • 2748

Okhttp使用和源码分析一(OkHttp2.x用法)

由Square团队发明的网络框架OkHttp,想必目前火过移动互联网半边天。从由Google发明的Volley停止了更新后,而OkHttp得到了官方的认可,并在不断优化。上篇文章我们简单分析和演示了V...
  • qq_21983189
  • qq_21983189
  • 2017年06月12日 17:42
  • 253

retrofit2+okhttp3图片上传及进度监听

1、使用jar包 由于retrofit2与1的写法有很大的变化,并且对okhttp存在着依赖。所以需要确定选择使用方向,以免陷入不必要的坑中。 本篇讲采用retrofit2 + okhttp3做结合使...
  • shizhesx
  • shizhesx
  • 2016年10月26日 16:26
  • 1891

Android网络编程(五)OkHttp2.x用法全解析

讲完了Volley,我们接下来看看目前比较火的网络框架OkHttp, 它处理了很多网络疑难杂症:会从很多常用的连接问题中自动恢复。如果您的服务器配置了多个IP地址,当第一个IP连接失败的时候,OkHt...
  • itachi85
  • itachi85
  • 2016年04月18日 12:10
  • 19098

okhttp3与旧版本okhttp的区别分析

1、包名改变        包名改了由之前的 com.squareup.http. 改为 okhttp3. 我们需要将导包名直接换掉,另外记得修改progurad-rules.pro 文件中将对应包名...
  • u012532559
  • u012532559
  • 2017年01月07日 16:27
  • 2089

使用okhttp进行图片下载,上传,get,post网络请求

github源码地址:    https://github.com/AndroidDerek/IMoocDict 效果: 1连接网络: 2断开网络 依赖: compile ...
  • dianziagen
  • dianziagen
  • 2017年04月12日 17:24
  • 1203
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:okhttp2 和 okhttp 3上传单张或者多张图片的差异( 更好地理解使用okhttp )
举报原因:
原因补充:

(最多只允许输入30个字)