Ответ 1
Изучение мысли с точки зрения событий действительно является ключевым здесь. Ты можешь это сделать.:)
Первое правило: никогда не останавливать поток пользовательского интерфейса. Пользовательский интерфейс отвечает за то, что ваше приложение чувствует себя отзывчивым. Любая работа, которую вы там делаете, не должна блокироваться; делайте то, что вам нужно, и возвращайтесь как можно быстрее. Определенно избегайте ввода/вывода в потоке пользовательского интерфейса. (Есть некоторые места, где вы не можете реально помочь ему из-за требований жизненного цикла, например, сохранить состояние приложения в onPause
.) Если вы когда-либо вызывают Thread.sleep
в потоке пользовательского интерфейса, которое вы делаете это неправильно.
Android применяет это при ошибке "Ошибка приложения" (или "ANR" ), которую видит пользователь. Всякий раз, когда вы видите это в приложении для Android, это означает, что разработчик сделал что-то, что заставило поток пользовательского интерфейса задерживаться слишком долго. Если устройство действительно увязло по какой-либо причине, эта ошибка может быть не ошибкой разработчика приложения, но обычно это означает, что приложение делает что-то неправильно.
Вы можете использовать эту модель в своих интересах, разместив свои собственные события. Это дает вам простой способ рассказать о вашем приложении, "сделайте это позже". В Android ключ для размещения собственных событий находится в классе Handler
. Метод postDelayed
позволяет вам запланировать Runnable
который будет выполнен после определенного количества миллисекунд.
Если у вас есть Activity, который выглядит примерно так:
public class MyActivity extends Activity {
private Handler mHandler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mHandler.postDelayed(new Runnable() {
public void run() {
doStuff();
}
}, 5000);
}
private void doStuff() {
Toast.makeText(this, "Delayed Toast!", Toast.LENGTH_SHORT).show();
}
}
Затем через 5 секунд после создания активности вы увидите тост, созданный в doStuff
.
Если вы пишете пользовательский View
, это еще проще. В представлениях есть свой собственный postDelayed
метод, который выведет все на правильный Handler
, и вам не нужно создавать свои собственные.
Вторым правилом является: в версии UI будет изменяться только только. Те исключения, которые вы получаете и игнорируете, означают, что что-то пошло не так, и если вы проигнорируете их, ваше приложение, вероятно, начнет вести себя неправильно. Если ваше приложение выполняет большую часть своей работы в других потоках, вы можете post
события непосредственно в представление, которое хотите изменить, чтобы изменения выполнялись правильно.
Если у вас есть ссылка на ваш Activity
из этой части вашего кода, вы также можете использовать Activity#runOnUIThread
, что делает именно то, что название подразумевает. Вы можете предпочесть этот подход, если публикация в одном представлении в действительности не имеет смысла в контексте.
Что касается обновлений представлений, не появляющихся до тех пор, пока вы не нажмете кнопку, что это за виды? Являются ли они настраиваемыми представлениями, которые рисуют эти обновления? Если да, помните ли вы называть invalidate
после изменения данных, чтобы вызвать перерисовку? Представления только перерисовывают себя после того, как они были признаны недействительными.