ProgressBar не будет виден в Android Studio из кода - PullRequest
0 голосов
/ 16 февраля 2020

Итак, я создал приложение, и я пытаюсь показать индикатор выполнения в тот момент, когда нажимается кнопка.

Отображается только при установке View.VISIBLE * 1004. * вне обработчика.

Kotlin код:

button.setOnClickListener {

progressBar.visibility = View.VISIBLE
        runBlocking {


            try {
                //HTTP request removed because of confidentiality, assume im setting delay


            } catch (e: Exception) {
                Log.e(tag, "Error: " + e.message)

                Toast.makeText(this@MainActivity, "Could not find page", Toast.LENGTH_LONG)
                    .show()

            }

        }
     progressBar.visibility = View.GONE
    }

Кнопка XML:

<ProgressBar
        android:id="@+id/progressBar"
        style="?android:attr/progressBarStyle"
        android:alpha="1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:visibility= "invisible"/>

Я искал несколько часов и не смог найти что-то подходящее для моего случая.

Требуется вывод: Получить индикатор выполнения в тот момент, когда нажимается кнопка.

Ответы [ 3 ]

2 голосов
/ 16 февраля 2020

Удалить строку из кода:

progressBar.visibility = View.GONE
0 голосов
/ 16 февраля 2020

Выполнение такой команды, как progressBar.visibility = View.VISIBLE, может занять несколько наносекунд (приблизительно 144100). Основной поток может попросить некоторые другие потоки выполнить некоторые задачи и вместо ожидания ответа от этих потоков возобновляет свое нормальное выполнение (следующие строки кода). Ваша следующая строка кода (runBlocking: запускает новую сопрограмму и блокирует текущий поток прерывисто до его завершения.) Блокирует текущий, пока сопрограмма, запущенная из метода runBlocking, не будет завершена. Это просто означает, что основной поток не может выполнять другие команды или обрабатывать ответы, полученные от других потоков, пока сопрограмма не будет завершена. Как только сопрограмма закончена. Основной поток возобновляет свое выполнение, показывая и скрывая индикатор выполнения одновременно, поэтому вы не видите, что индикатор выполнения вращается.

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

Проверьте здесь типы диспетчеров. https://medium.com/androiddevelopers/coroutines-on-android-part-i-getting-the-background-3e0e54d20bb

   bt.setOnClickListener {
        progressBar.visibility = View.VISIBLE
        GlobalScope.launch {
            networkCall()
        }

    }

 private suspend fun networkCall() {
    withContext(Dispatchers.Default) {
        for (i in 1..50000) {
            Log.v("Network call", "$i")
       }
        runOnUiThread {
            progressBar.visibility = View.INVISIBLE
        }
    }
}

}

0 голосов
/ 16 февраля 2020

Поскольку ваш стиль (style="?android:attr/progressBarStyle"), а ширина / высота (wrap_content). для барного стиля. Вы должны дать ему значение (например, 100dp для WIDTH и 20dp для HEIGHT.

...