首页 > 解决方案 > 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跳到最大数字。我可以看到在正确的时间写入的日志,但进度条没有变化。

标签: androidkotlinreduxandroid-progressbar

解决方案


我可以通过以下步骤解决我的问题:

删除 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()
            }
        }
  ...

推荐阅读