您的位置:首页技术文章
文章详情页

Android下,rxJava+retrofit 并发上传文件和串行上传文件的效率为什么差不多?

【字号: 日期:2024-02-28 16:07:55浏览:28作者:猪猪

问题描述

有个功能需要同时上传N个文件。代码如下:

ApiService as = ApiManager.getApiService(); final ExecutorService es = Executors.newFixedThreadPool(9);final int count = Bimp.tempSelectBitmap.size();final CountDownLatch finishedLatch = new CountDownLatch(count);final long start = System.currentTimeMillis();for (int k = 0; k < count; k++) { final String fp = Bimp.tempSelectBitmap.get(k).getImagePath(); RequestBody fbody = RequestBody.create(MediaType.parse('image/*'), new File(fp)); as.uploadAttach(fbody) .subscribeOn(Schedulers.from(es)) .observeOn(Schedulers.computation()) .subscribe(new Subscriber<UploadAttachJSON>() {@Overridepublic void onCompleted() {}@Overridepublic void onError(Throwable e) { finishedLatch.countDown(); Log.e('UPLOAD FAILED -------->', fp);}@Overridepublic void onNext(UploadAttachJSON uploadAttachJSON) { finishedLatch.countDown(); sb.append(uploadAttachJSON.url).append(','); Log.e('UPLOADED IMAGE URL -->', uploadAttachJSON.url); h.post(new Runnable() {@Overridepublic void run() { pd.setMessage('正在上传... ' + (count - finishedLatch.getCount()) + '/' + count);} });} });}try { finishedLatch.await();} catch (InterruptedException e) { e.printStackTrace();}long end = System.currentTimeMillis();Log.e('IMAGE UPLOAD COMPLETED', (end - start) + '');es.shutdown();

以上为并行的写法。从线程池中拿出N个线程来同时上传这N个文件。

串行写法: .subscribeOn(Schedulers.io()) 或者 用Observable.merge来合并这些请求。

结果发现并行和串行所花费的时间几乎都差不多。。 是不是和android底层有关?这些网络请求其实最后都被底层给block了,然后串行出去?

问题解答

回答1:

设备的网速是不是有限制

回答2:

有很多因素需要考虑1.自己的代码实现2.设备底层的传输实现3.服务器接收数据的代码实现

任何一个部分不是并发的,最后的结果就不是并发的

标签: java
相关文章: