前言
之前在我的博客中分享了如何利用微博Api开发仿制新浪微博,有新兴趣的可以看一下:
http://blog.csdn.net/DeMonliuhui/article/category/6339797
然后在写微博界面:http://blog.csdn.net/demonliuhui/article/details/52076393 遇到了无法上传多图的问题,那个时候还是个新手,想不到什么解决方案,最近在做另一个项目时遇到相同的问题,成功解决。
问题描述
通常我们进行网络请求开发的时候会遇到网络请求一个参数对应多个值情况,例:
1.通过选中的多个ID,删除物品。
2.微博配图,一个图片参数对应多张图片。
一个参数对应多个值的问题,我们一般想到的方案无非以下三种:
1.循环添加参数
以下面为请求参数pic传递多个图片url代码为例:循环url的list,将url传递给请求参数pic。
error:实际上只会上传最后一张图片,即pic只能获得传递的最后一个url。也就是我所遇到的问题。
//filesPath为List<String>对象,里面存放的是需要上传的文件的地址
for (String path : filesPath) {
Log.i("------------", path);
//FileBody对象,需要上传的文件
ContentBody file = new FileBody(new File(path));
multipartEntity.addPart("pic", file);
}
2.循环改变参数,多次进行网络请求
以下面这段选中多个商品,进行网络请求的代码为例。这种方法就是每次获取一个id,然后就进行请求一次。
error:
1.网络请求都是异步线程,每个请求都创建一个线程,无疑是浪费资源,造成线程不安全。
2.对于写微博来说,一条文字多个图片,结果就是会发表多条微博,文字内容相同,每条的图片依次是你想上传的图片。(自行脑补)
for (int i = 0; i < isSelectItems.size(); i++) {
// 判断当前的物料i有没有被选中
// 选中则修改物料i的品类id
if (isSelectItems.get(i)) {
mainPresenter.updateDataFromId(list.get(i).getId(), category.getCategoryId());//网络请求的方法
}
}
3.将请求的值存放在数组中
这种方案显然是最合理的。然而存在以下问题:
1.众所周知,数组在代码中传递是以地址的方式存在的,无法从真正意义上将值传递给参数。循环将值取出来,又变成了上一个问题。
2。数组的长度难以控制,无法确定选取多少个值。
解决方案
使用Josn:
1,JSONObject
json对象,就是一个键对应一个值,使用的是大括号{ },如:{key:value}
2,JSONArray
json数组,使用中括号[ ],只不过数组里面的项也是json键值对格式的
熟悉Json的都知道Json有如下属性:
1.json对象与string可以无条件相互转换。或者来说json本来就是string类型的字符串。
2. json数组允许一个键值对应多个json对象。例如:一个data参数,对应多个信息。
3. json的值可以是任意参数类型。
"data": [
{
"name": "manager",
"memberId": "333",
"authority": 0
},
{
"name": "a",
"memberId": "1",
"authority": 1
}
]
解决代码示例:
Map<String, String> changeMember = new HashMap<>();
JSONArray memberIds = new JSONArray();//创建json数组
for (int i = 0; i < len - 1; i++) {
try {
memberIds.put(i, list.get(i + 1).getMemberId());//为该数组添加值
} catch (JSONException e) {
e.printStackTrace();
}
}
changeMember.put("memberIds", memberIds.toString());
post.postNoResult(MemAty.this, Api.MEMBER_DELETE_url, changeMember, null);//网络请求的方法
如果有不明白的可以仔细了解一下 JSONObject、JSONArray。
盗了人家的图,给个链接 0.0:
http://blog.csdn.net/lishuangzhe7047/article/details/28880009
结语
1.JSONArray中可以添加任何类型的值,无需创建多个类型的数组,方便使用。
2.由于Json在数据传递方面非常强大,局限性很小,处理简单,建议多了解使用。
3.Json可以跟List进行相互转换。
http://blog.csdn.net/demonliuhui/article/details/52949079