我尝试使用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)都没有被调用,但感觉就像订阅不断拉动新事件。
答案 0 :(得分:0)
来自sample
文档,
Sample运算符定期查看Observable并发出 自上次以来最近发布的任何一项 取样
&#34;看着&#34;暗示它每个时期都在工作,这会占用你的CPU使用率。每隔16毫秒,它就会开火并寻找是否需要发射物品。您应该将其拨回100-500毫秒,具体取决于您的UI限制。