在很早之前我就关注过rxjava。里面的功能非常的吸引人。比如任务线性化、任务线程调度、平铺和集合任务等等。但是我不太想因为几个功能点引入第三方,所以再三思考后还是没有用上。这段时间空闲下来了我决定实现这部分的功能。
提一个比较适合的例子,在去年的一个项目中有一个功能,这个功能类似于微信的朋友圈,可以上传文字、图片和小视频,项目中所有的图片都先上传到一个接口上,由这个接口再返回一个图片url。问题是这个接口一次只支持一张图片,联系对方的接口开放人员(这个项目是移动端我们公司负责,其它全由另外一个公司负责),貌似请假也不知道是做别的项目没空来调整或者新开接口了。很郁闷,但是又要赶项目,只能硬着头皮上了
使用rx风格处理
前提讲完了,直接上代码
/** * 发布朋友圈文章 * @param images 多图像本地路径 * @param content 发表的文字 */ private void publishMoments(String[] images, final String content){ startTask(Task.beginCycle(images) //使用beginCycle展开数组 .next(new Action<String,Request>(){ @Override protected Request execute(String param){ return new Request(UPLOAD_IMAGE).put("image",new File(param)); //生成上传单个图像的网络请求 } }) .next(new NetAction<ResponseUploadImage>(){ @Override protected void executeAdapt(ResponseUploadImage responseUploadImage){ if(!responseUploadImage.success) { //检查上传是否成功,如果不成功就停止任务链并且提示 stopTask(); N.showShort(MainActivity.this,responseUploadImage.errorMes); } } }) .again(new Action<List<ResponseUploadImage>,Request>(){ //使用again来结束之前的循环并且获取结果数组 @Override protected Request execute(List<ResponseUploadImage> param){ StringBuilder sb=new StringBuilder(); Request publishMomentsRequest=new Request(PUBLISH_MOMENTS); for(ResponseUploadImage image:param) sb.append(image).append("|"); if(sb.length()>0) sb.deleteCharAt(sb.length()-1); publishMomentsRequest.put("user_name","test"); publishMomentsRequest.put("password","123456"); publishMomentsRequest.put("content",content); publishMomentsRequest.put("images",sb.toString()); return publishMomentsRequest; } }) .next(new NetAction<ResponsePublishMoments>(){ @Override protected void executeAdapt(ResponsePublishMoments responsePublishMoments){ //做了一些只能在主线程中的事件 } },ThreadType.MAIN)); //指定回调运行在主线程中 }说明都在注释里了,应该没什么难度,只要缕清逻辑在套用这个工具类,一些都变的清晰可靠了