1

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

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

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

Что такое простой способ достижения этой анимации? Будет ли проще работать с кадровой анимацией?

ответ

1

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

+0

Возможно, вы имели в виду call mProgressBar.incrementProgressBy (10); от асинхронной задачи? Будет ли счетчик обновляться на экране сразу после вызова incrementProgressBy(), даже если поток пользовательского интерфейса занят? – user1139880

+0

Нет, вы должны реализовать свою собственную AsyncTask, где в методе onPreExecute вы должны настроить свой счетчик, в методе doInBackground вы должны сделать все, что у вас есть, и в onPostExecute получить результат и отклонить счетчик. Есть много информации об этой теме в Интернете, просто скачайте ее. –

+0

Обратите внимание на ответ, который я ожидал, но, вероятно, правильная вещь (загрузка работы в задачу async). Маркировка как ответ. – user1139880

1

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

1

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

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

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

+0

Длительная задача (до 3 секунд), которую я выполняю, - это восстановление настроек по умолчанию. Приложение имеет 30 или около того предпочтений, и когда пользователь выбирает действие «Восстановить настройки», каждому из 30 настроек присваивается значение по умолчанию. Каждый из этих настроек изменяет триггер прослушивателя предпочтений в главном приложении, который выполняет необходимую обработку этого изменения предпочтений. Эти обработчики связаны с UI и, таким образом, работают в потоке пользовательского интерфейса. Я думаю, что я мог бы разбить 30 настроек на отдельные события пользовательского интерфейса (например, через метод post()), поэтому поток пользовательского интерфейса не блокируется слишком долго. – user1139880

+0

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

+0

Один конец в конце. Некоторые из настроек связаны с виджетами, и они генерируют растровые файлы и обновляют удаленные представления (я использую пользовательские шрифты, не поддерживаемые удаленными представлениями. Необходимо создать два файла изображений: один для портретного и один для пейзажа для каждого размера виджета, использования). – user1139880

Смежные вопросы