Search code examples
androidkotlinreduxandroid-progressbar

Progressbar not updating after Redux Event


I know this question has been asked quite often here, but non of the answers helped me.

I am writting a gallery app with a thumbes-regeneration feature. In oder to show the progress i added the progressbar which should count the number of created thumbnails. After each finished thumbnail-generation i dispatch a Redux event and listen to it in my Fragement, in order to change the progressbar.

Generating all thumbnails for all visible photos/videos

private fun onMenuRefreshThumbs(activity: Activity) {
    val mediaPath = Redux.store.currentState.mediaPath
    val fileRepository = FileRepository(context = activity, mediaPath = mediaPath)
    activity.runOnUiThread {
        fileRepository.regenerateThumbs(activity)
    }
}

Functions inside the above used 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
}

Subscribing to Redux in the Fragement:

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)
    }
}

I tried all difference version of calling a thread in both cases. But no matter if its done with the handler or by activity.runOnUiThread, the progressbar never changes untill all thumbs are finished and the progressbar jumps from 0 to the maximum number. I can see the logs which are written in the right time, but not the progressbar changing.


Solution

  • I could fix my problem with following steps:

    Removing the runOnUiThread() call

    private fun onMenuRefreshThumbs(activity: Activity) {
        val mediaPath = Redux.store.currentState.mediaPath
        val fileRepository = FileRepository(context = activity, mediaPath = mediaPath)
        fileRepository.regenerateThumbs(activity)
    }
    

    Adding a thread for each 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()
                }
            }
      ...