Спиннерная анимация при длительных операциях - PullRequest
1 голос
/ 26 марта 2012

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

Я создал настраиваемое диалоговое окно, которое всплывает во время длительной операции, и оно имеет такой макет

<?xml version="1.0" encoding="utf-8"?>
<ProgressBar xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/spinner"
    style="?android:attr/progressBarStyleLarge"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

Проблема в том, что он не вращается. Как заставить его вращаться, даже если поток пользовательского интерфейса занят?

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

// In the custom dialog class. mProgressBar is the ProgressBar in the layout.
// Called externally once when the dialog is shown
public void tick() {
    mProgressBar.incrementProgressBy(10);
    mProgressBar.postDelayed(new Runnable() {
        @Override
        public void run() {
            // Not a recursion since it's done in a future event.
            tick();
        }
    }, 100);
}

Какой простой способ добиться этой анимации? Покадровая анимация будет легче сделать?

Ответы [ 3 ]

1 голос
/ 26 марта 2012

Вам может потребоваться установить истинное значение для свойства android: indeterminate в XML или коде

1 голос
/ 26 марта 2012

Android: вы делаете это неправильно ...

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

Я предполагаю, что вы хотите выполнить задачу в потоке пользовательского интерфейса, потому что от того, что вы отображаете, зависитрезультат задачи?В этом случае отобразите спиннер в главном потоке, запустите задачу в фоновом режиме (AsyncTask был разработан именно для этого), а затем обновите пользовательский интерфейс только после завершения задачи.Тот же конечный результат без ужасного пользовательского опыта.

1 голос
/ 26 марта 2012

Использовать AsyncTask http://developer.android.com/guide/topics/fundamentals/processes-and-threads.html Не вращается, потому что выполняется в потоке пользовательского интерфейса

...