android 使用OkHttp上传多张图片的实现代码
简述
还是先来说说为啥用OkHttp作为多图片上传的框架,原因有两点:
1、OkHttp可以作为Volley底层传输协议,速度更快
2、使用Xutils和KJFramework上传图片存在一个小问题,首先,可以上传,并且可以上传多张图片,也可以上传其他的参数,那问题在哪里呢?在后台接受参数时很不灵活,Xutlis及KJFramework使用HashMap来上传每个参数,每一张图片也必须有一个唯一的key,上传一张图片就要定义一个参数来接收,上传两张图片就要定义两个参数来接收,当上传的图片数量不确定的时候,如最多9张或者16张,后台接受图片的时候就要定义9个或者16个,这样的方式很不利于扩展,最好是一个参数接收所有所有图片,不会因为这种不确定的问题,就去定义很多的参数,然后一个个判断是否存在。OkHttp底层则不是这样,大概的浏览了下源码,底层接收参数的时候使用的是List,只要使用相同的key就可以添加到同一个list,而后台只需要根据这一个key不断遍历就行,无论多少张图片都无障碍,也没有了后顾之忧。
核心代码实现
//参数类型
privatestaticfinalMediaTypeMEDIA_TYPE_PNG=MediaType.parse("image/png");
//创建OkHttpClient实例
privatefinalOkHttpClientclient=newOkHttpClient();
MultipartBuilderbuilder=newMultipartBuilder().type(MultipartBuilder.FORM);
//遍历map中所有参数到builder
for(Stringkey:map.keySet()){
builder.addFormDataPart(key,map.get(key));
}
//遍历paths中所有图片绝对路径到builder,并约定key如“upload”作为后台接受多张图片的key
for(Stringpath:paths){
builder.addFormDataPart("upload",null,RequestBody.create(MEDIA_TYPE_PNG,newFile(path)));
}
//构建请求体
RequestBodyrequestBody=builder.build();
//构建请求
Requestrequest=newRequest.Builder()
.url(url)//地址
.post(requestBody)//添加请求体
.build();
//发送异步请求,同步会报错,Android4.0以后禁止在主线程中进行耗时操作
client.newCall(request).enqueue(newCallback(){
@Override
publicvoidonFailure(Requestrequest,IOExceptione){
System.out.println("request="+request.urlString());
System.out.println("e.getLocalizedMessage()="+e.getLocalizedMessage());
}
@Override
publicvoidonResponse(Responseresponse)throwsIOException{
//看清楚是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上传多张图片的实现代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!