【问题标题】:Progressbar not updating after Redux EventRedux 事件后进度条未更新
【发布时间】:2026-01-19 09:55:01
【问题描述】:

我知道这个问题在这里经常被问到,但没有一个答案对我有帮助。

我正在编写一个带有拇指重生功能的图库应用。为了显示进度,我添加了进度条,它应该计算创建的缩略图的数量。每次完成缩略图生成后,我都会发送一个 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跳到最大数字。我可以看到在正确的时间写入的日志,但进度条没有变化。

【问题讨论】:

    标签: android kotlin redux android-progressbar


    【解决方案1】:

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

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

    【讨论】: