android - Redux 事件后进度条未更新
问题描述
我知道这个问题在这里经常被问到,但没有一个答案对我有帮助。
我正在编写一个带有拇指再生功能的画廊应用程序。为了显示进度,我添加了进度条,它应该计算创建的缩略图的数量。每次完成缩略图生成后,我都会发送一个 Redux 事件并在我的 Fragment 中收听它,以更改进度条。
为所有可见的照片/视频生成所有缩略图
private fun onMenuRefreshThumbs(activity: Activity) {
val mediaPath = Redux.store.currentState.mediaPath
val fileRepository = FileRepository(context = activity, mediaPath = mediaPath)
activity.runOnUiThread {
fileRepository.regenerateThumbs(activity)
}
}
上面用到的FileRepository里面的函数:
fun regenerateThumbs(context: Context) {
val success = File(getAbsoluteThumbsDir(context, mediaPath)).deleteRecursively()
getMediaItems()
}
fun getMediaItems(): MediaItemList {
val success = File(thumbPath).mkdirs()
val isThumbsEmpty = File(thumbPath).listFiles().isEmpty()
val mediaFileList = File(mediaPath).listFiles().
.sortedByDescending { it.lastModified() }
val list = MediaItemList()
mediaFileList.apply {
forEach {
list.add(MediaItem(it.name, 0, 0))
if (isThumbsEmpty) {
getOrCreateThumb(it)
Redux.store.dispatch(FileUpdateAction(it))
}
}
}
return list
}
在 Fragment 中订阅 Redux:
private fun subscribeRedux() {
val handler = Handler(Looper.getMainLooper())
val activity = requireActivity()
subscriber = { state: AppState ->
when (state.action) {
...
is ClearSelection -> {
progressCounter = 0
// fragment_gallery_progress.visibility = View.GONE
}
is FileUpdateAction -> {
Handler().post {
progressCounter++
fragment_gallery_progress.visibility = View.VISIBLE
fragment_gallery_progress.progress = progressCounter
// fragment_gallery_progress.invalidate()
log.d("test: Thumb Index $progressCounter ${state.action.mediaItem.name} was created")
}
Unit
}
}
}.apply {
Redux.store.subscribe(this)
}
}
在这两种情况下,我都尝试了调用线程的所有不同版本。但无论是使用处理程序还是通过activity.runOnUiThread 完成,进度条都不会改变,直到所有拇指都完成并且进度条从0跳到最大数字。我可以看到在正确的时间写入的日志,但进度条没有变化。
解决方案
我可以通过以下步骤解决我的问题:
删除 runOnUiThread() 调用
private fun onMenuRefreshThumbs(activity: Activity) {
val mediaPath = Redux.store.currentState.mediaPath
val fileRepository = FileRepository(context = activity, mediaPath = mediaPath)
fileRepository.regenerateThumbs(activity)
}
为每个 Thumbs-Generation 添加一个线程:
fun getMediaItems(): MediaItemList {
val success = File(thumbPath).mkdirs()
val isThumbsEmpty = File(thumbPath).listFiles().isEmpty()
val mediaFileList = File(mediaPath).listFiles().
.sortedByDescending { it.lastModified() }
val list = MediaItemList()
mediaFileList.apply {
forEach {
list.add(MediaItem(it.name, 0, 0))
if (isThumbsEmpty) {
Thread {
getOrCreateThumb(it)
Redux.store.dispatch(FileUpdateAction(it))
}.start()
}
}
...
推荐阅读
- angular - ngx-pinch-zoom 与 angular 4 错误的集成
- python - How to change fields.One2Many view in odoo 12?
- java - 运行时权限在 API 级别 28 中不起作用
- entity-framework - EF Core 的 __EFMigrationsHistory 中不存在模型列
- java - 如何注入自定义主体?
- android - 如何在 Ubuntu 16.04 上为不同的 CPU 架构生成 libjpeg-turbo.so 文件?
- opengl-es - How to draw texture circle opengl-es?
- python-3.x - Why does a tuple with more than one (all) None value evaulate to True?
- react-native - 如何检测用户触摸原生反应中的元素?
- php - 发送电子邮件收到错误,因为无法连接到 SMTP 主机