android - ListAdapter 网络调用从服务器下载文件并使用 WorkManager 显示进度
问题描述
我有兴趣了解使用改造和在项目适配器上显示进度的下载文件的设计。
我正在使用工作管理器来完成我的工作并使用改造下载文件,但目前我没有找到任何方法来显示项目的进度。
请在下面找到我的代码。
适配器代码
class PamphletListAdapter(
appExecutors: AppExecutors,
private val callback: ClickCallback)
: DataBoundListAdapter<PamphletModel, PamphletCardViewBinding>(appExecutors,
PamphletListItemDiff()) {
override fun createBinding(parent: ViewGroup): PamphletCardViewBinding {
return PamphletCardViewBinding.inflate(LayoutInflater.from(parent.context), parent, false)
}
override fun bind(binding: PamphletCardViewBinding, item: PamphletModel, position: Int, isLast: Boolean) {
binding.pamphletModel = item
binding.pamphletItemView.setOnClickListener {
binding.pamphletModel?.let { data ->
callback.onClick(data, position)
}
}
}
interface ClickCallback {
fun onClick(data: PamphletModel, position: Int)
}
}
片段上的 OnClick 处理程序。
private fun addToDownload(position: Int, data: PamphletModel) {
history.push(position)
val workData: Data = Data.Builder()
.putString(Constants.WORK_MANAGER_DATA, PamphletModel.getStringFromPamphlets(data))
.putInt(Constants.WORK_MANAGER_POSITION, position)
.build()
val fileManager = OneTimeWorkRequestBuilder<FileDownLoadManagerWorker>()
.setInputData(workData).build()
WorkManager.getInstance().getWorkInfoByIdLiveData(fileManager.id).observe(this@PamphletListFragment, Observer {
handlePDFDownloadResponse(fileManager, it)
})
WorkManager.getInstance().enqueue(fileManager)
}
工作经理代码。
override fun doWork(): Result {
val pamphletModel = PamphletModel.getPamphletsFromString(inputData.getString(Constants.WORK_MANAGER_DATA))
if (PatwFileUtils.checkCacheFilesExist(pamphletModel.pdfPath, pamphletModel.thumbnailPath)) {
return Result.success()
}
val rootDirectory = PatwFileUtils.getPamphletDirectory(context)
//download pdf
pamphletModel.pdfPath = DownloadManager.downloadFile(pamphletModel.downloadUrl, PatwFileUtils.getPamphletPDFFilePath(rootDirectory, pamphletModel.pamphletId))?.path
//Download image -> save on thumbnail Path
pamphletModel.thumbnailPath = getPamphletThumbnailImage(context, pamphletModel)
pamphletModel.isDownloaded = Constants.PDF_STATUS_DOWNLOADED
pamphletModel.createAt = Date()
//Insert data to database
pamphletDao.insert(pamphletModel)
val outputData = createOutputData(pamphletModel, inputData.getInt(Constants.WORK_MANAGER_POSITION, 0))
Timber.i("Work successfully completed...$pamphletModel")
return Result.success(outputData)
}
工作经理完成的观察员代码。
private fun handlePDFDownloadResponse(fileManager: OneTimeWorkRequest, workInfo: WorkInfo) {
Timber.i("Work id = ${fileManager.id} State = ${workInfo.state} ")
if (workInfo.state == WorkInfo.State.SUCCEEDED) {
val result = workInfo.outputData
val resultPosition: Int = result.getInt(Constants.WORK_MANAGER_POSITION, 0)
val resultData = PamphletModel.getPamphletsFromString(result.getString(Constants.WORK_MANAGER_DATA))
resultData.isDownloaded = Constants.PDF_STATUS_DOWNLOADED
pamphletListAdapter.notifyItemChanged(resultPosition)
if (!history.empty() && history.peek() == resultPosition) {
history.clear()
UtilIntent.launchPamphletFragment(context!!, configuration, resultData)
}
}
}
请帮助我显示项目的进度,如果需要任何其他课程代码,请告诉我。
解决方案
您将需要根据您的进度更新一些其他数据源。WorkManager 不提供此功能。例如,您可以使用 Room 更新某些侧数据库中的进度,并使用 LiveData 观察值。
推荐阅读
- json - 节点名称中 JSON Xpath 的通配符
- python - Python权限被拒绝linux
- python - 字符串相乘-Leetcode using Karatsuba algorithm with Python
- html - 从 Spring Boot 项目的 application.properties 中检索 Google Maps API 密钥?
- regex - 将第一行追加到以下行直到下一个空白行?
- android - 如何使用 Coroutines Flow 根据另一个视图的变化来修改一个视图?
- express - Express 无法从另一个目录提供静态文件
- c++ - 加载共享库时出现 C++ 错误:libopencv_ximgproc.so.4.4
- python - 如何从python中的列表中删除零值列表
- python - 如何从一个 locustfile 中生成 1800 rps?