gpt4 book ai didi

java - 在 ViewHolder 中使用 RxJava

转载 作者:行者123 更新时间:2023-11-30 05:10:54 25 4
gpt4 key购买 nike

我致力于图像编辑 Android 应用程序。在此应用程序中,用户可以下载 Assets 。因为这些资源比较大,所以我使用 DownloadManager 来下载它们。用户可以下载的项目显示在 RecyclerView 中。我想做的是将 DownloadManager 下载任务绑定(bind)到 RecyclerView 中的项目,以便用户看到下载进度。这是我为获取下载进度而编写的 Rx 包装器。

private Observable<Integer> createDownloadProgressListener(long downloadId) {
return Observable.create(observer -> {
boolean downloading = true;

while (downloading) {
DownloadManager.Query q = new DownloadManager.Query();
q.setFilterById(downloadId);

Cursor cursor = downloadManager.query(q);
cursor.moveToFirst();
int bytes_downloaded = cursor.getInt(cursor
.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
int bytes_total = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));

if (cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)) == DownloadManager.STATUS_SUCCESSFUL) {
downloading = false;
observer.onNext(100);
observer.onCompleted();
}

final int dlProgress = (int) ((bytes_downloaded * 100L) / bytes_total);

observer.onNext(dlProgress);
Log.d(TAG, "Download progress: " + dlProgress);

cursor.close();
}
});
}

下面是我如何在 ViewHolder 的绑定(bind)方法中绑定(bind)到这个可观察对象:

private void bindEffectDownloadTask() {
if (item.getDownloadRefId() != null && baseActivity.rxDownloadManager.getDownloadProgressListener(item.getDownloadRefId()) != null) { baseActivity.rxDownloadManager.getDownloadProgressListener(item.getDownloadRefId())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnSubscribe(() -> item.setDownloading(true))
.doOnTerminate(() -> item.setDownloading(false))
.subscribe(progress ->
updateDownloadProgress(progress),
error -> {
Log.d(TAG, "Error in download task: " + error.getMessage());
},
() -> {
downloadedState();
});
}
}

我的问题是 updateDownloadProgress(我在其中设置自定义圆进度 View 的进度)不仅更新了当前的 ViewHolder,还更新了其他的。如何确保只更新当前的 ViewHolder?或者,如果这种方法是完全错误的,那么在 RecyclerView 项目中处理异步数据流的最佳实践是什么?也许我应该从 BehaviorSubject 发出下载进度和对象 ID,在我的 Activity 中订阅它并在适配器中找到要更新的项目并用进度更新它们?

编辑

updateDownloadProgress 方法:

void updateDownloadProgress(int progress) {
downloadButton.setVisibility(View.GONE);
downloadProgressBar.setVisibility(View.VISIBLE);
downloadProgressBar.setProgress(progress);
}

最佳答案

您可以使用 setTag 和 getTag 以便仅更新当前的 ViewHolder

关于java - 在 ViewHolder 中使用 RxJava,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53770179/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com