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

发布于 2022-09-04 02:10:14 字数 2675 浏览 16 评论 0

有个功能需要同时上传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>() {

                                @Override
                                public void onCompleted() {
                                }

                                @Override
                                public void onError(Throwable e) {
                                    finishedLatch.countDown();
                                    Log.e("UPLOAD FAILED -------->", fp);
                                }

                                @Override
                                public void onNext(UploadAttachJSON uploadAttachJSON) {
                                    finishedLatch.countDown();
                                    sb.append(uploadAttachJSON.url).append(",");
                                    Log.e("UPLOADED IMAGE URL -->", uploadAttachJSON.url);

                                    h.post(new Runnable() {
                                        @Override
                                        public 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了,然后串行出去?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

寒尘 2022-09-11 02:10:14

设备的网速是不是有限制

鸢与 2022-09-11 02:10:14

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

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

尝蛊 2022-09-11 02:10:14

参考资料:Rx: Scheduler:

Schedulers.io()

用于IO密集型任务,如异步阻塞IO操作,这个调度器的线程池会根据需要增长;对于普通的计算任务,请使用Schedulers.computation();Schedulers.io( )默认是一个CachedThreadScheduler,很像一个有线程缓存的新线程调度器

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文