RxJava sample()是CPU密集型的

时间:2015-11-13 13:34:48

标签: android rx-java rx-android

我尝试使用RxJava(在Android上)实现下载进度条。我希望能够以0.1%的分辨率报告(下载)进度。但是,如果连接速度很快,文件可能会非常快速地下载并产生大量事件。

因此我假设我必须使用.sample()限制事件的数量。我的实现如下:

        mRxSubscription = downloadProgressChangeObservable
                .ofType(DownloadProgress.class)
                .sample(16, TimeUnit.MILLISECONDS) // This is problematic
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Action1<DownloadProgress>() {
                    @Override
                    public void call(DownloadProgress downloadProgress) {
                        Log.v(TAG, "Recieved downloadProgress event. Progress: " + downloadProgress.getProgress());
                        setProgressPercent(downloadProgress);
                    }
                }, new Action1<Throwable>() {
                    @Override
                    public void call(Throwable throwable) {
                        Log.d(TAG, "error: " + throwable.toString());
                    }
                });

如果我只是订阅(没有.sample()),一切都很好,除非下载管理器发送的事件太快。但是,添加.sample()我的CPU负载总是增加到~30% - 同样在没有发出事件时。

我不确定我是否理解这一点。调用(DownloadProgress)或调用(Throwable)都没有被调用,但感觉就像订阅不断拉动新事件。

1 个答案:

答案 0 :(得分:0)

来自sample文档,

  

Sample运算符定期查看Observable并发出   自上次以来最近发布的任何一项   取样

&#34;看着&#34;暗示它每个时期都在工作,这会占用你的CPU使用率。每隔16毫秒,它就会开火并寻找是否需要发射物品。您应该将其拨回100-500毫秒,具体取决于您的UI限制。