Как эффективно отобразить диалоговое окно загрузки, если работа с kotlin сопрограммой занимает достаточно много времени? - PullRequest
3 голосов
/ 21 ноября 2019

Я хочу использовать сопрограммы kotlin для операций с базами данных и покажет пользователям экран загрузки. Моя базовая реализация выглядит следующим образом:

fun loadSomeData(){
    mainCoroutineScope.launch { 
        showLoadingDialog()
        // suspening function over Dispatchers.IO, returns list
        val dataList = fetchDataFromDatabase()
        inflateDataIntoViews(dataList)
        hideLoadingDialog()
    }
}

Это прекрасно работает для меня, когда загрузка занимает много времени для больших наборов данных. Но в тех случаях, когда fetchDataFromDatabase() заканчивается быстро, показ и скрытие диалогового окна в быстрой последовательности создает раздражающий эффект смещения.

Поэтому я хочу, чтобы диалоговое окно отображалось только в том случае, если функция fetchDataFromDatabase() принимаетболее чем, скажем, , 100 мс для завершения.

Итак, мой вопрос, Каков эффективный способ добиться этого с помощью сопрограмм kotlin?

Ответы [ 2 ]

2 голосов
/ 21 ноября 2019

Вот идея:

fun loadSomeData(){
    mainCoroutineScope.launch {
        val dialogJob = launch {
            delay(1000)
            try {
                showLoadingDialog()
                coroutineContext[Job]!!.join()
            } finally {
                hideLoadingDialog()
            }
        }
        val dataList = fetchDataFromDatabase()
        inflateDataIntoViews(dataList)
        dialogJob.cancel()
    }
}

Когда вы отменяете dialogJob, он должен либо нажать на оператор delay и не показывать диалоговое окно, либо на оператор join, который вызоветfinally блок для выполнения и скрытия.

0 голосов
/ 21 ноября 2019

Основная цель диалога загрузки состоит в том, чтобы пользователь не касался пользовательского интерфейса во время загрузки, но на это нет никаких гарантий. Всегда есть шанс, что пользователь коснется какой-то кнопки, прежде чем появится диалоговое окно.

Лучший способ сделать это - просто отключить или скрыть компоненты пользовательского интерфейса или, вообще, показать «загрузочную версию» вашего пользовательского интерфейса.

Лучше разрешить пользователю отменять загрузку, а не устанавливать короткий тайм-аут, так что вам все равно может понадобиться диалоговое окно или вспомогательная панель, показывающая кнопку отмены, или вы можете создать страницу менеджера задач в своем приложении, которая быбыть действительно сложным, хотя.

...