Ответ 1
post: post вызывает добавление Runnable в очередь сообщений,
Runnable: Представляет команду, которую можно выполнить. Часто используется для запуска кода в другом потоке.
run() : начинает выполнение активной части кода класса. Этот метод вызывается при запуске потока, созданного с помощью класса, который реализует Runnable.
getView().post(new Runnable() {
@Override
public void run() {
getView().startAnimation(a);
}
});
код: getView().startAnimation(a);
в вашем коде,
сообщение заставляет Runnable (код будет запускаться в другом потоке), чтобы добавить очередь сообщений.
Таким образом, startAnimation будет запущен в новом потоке, когда он извлекается из messageQueue
[ОБНОВЛЕНИЕ 1]
Почему мы используем новый поток вместо потока пользовательского интерфейса (основной поток)?
Тема интерфейса:
Когда приложение запускается, поток пользовательского интерфейса создается автоматически
он отвечает за отправку событий в соответствующие виджеты и это включает в себя события рисования.
Это также нить, с которой вы взаимодействуете с виджетами Android с помощью
Например, если вы нажмете кнопку на экране, поток пользовательского интерфейса отправляет событие касания в виджет, который, в свою очередь, устанавливает его нажал состояние и отправляет недействительный запрос в очередь событий. Поток пользовательского интерфейса отменяет запрос и уведомляет виджет о перерисовке Сам.
Что произойдет, если пользователь нажмет кнопку, которая будет выполнять долгую операцию?
((Button)findViewById(R.id.Button1)).setOnClickListener(
new OnClickListener() {
@Override
public void onClick(View v) {
final Bitmap b = loadImageFromNetwork();
mImageView.setImageBitmap(b);
}
});
Пользовательский интерфейс зависает. Программа может даже аварийно завершить работу.
public void onClick(View v) {
new Thread(new Runnable() {
public void run() {
final Bitmap b = loadImageFromNetwork();
mImageView.setImageBitmap(b);
}
}).start();
}
Это нарушает правило Android, согласно которому никогда не обновляет интерфейс непосредственно из рабочего потока
Android предлагает несколько способов доступа к потоку пользовательского интерфейса из других потоков.
- Activity.runOnUiThread(Runnable)
- View.post(Runnable)
- View.postDelayed(Runnable, long)
- Обработчик
Как показано ниже,
View.post(Runnable)
public void onClick(View v) {
new Thread(new Runnable() {
public void run() {
final Bitmap b = loadImageFromNetwork();
mImageView.post(new Runnable() {
public void run() {
mImageView.setImageBitmap(b);
}
});
}
}).start();
}
Handler
final Handler myHandler = new Handler(Looper.getMainLooper());
(new Thread(new Runnable() {
@Override
public void run() {
final Bitmap b = loadImageFromNetwork();
myHandler.post(new Runnable() {
@Override
public void run() {
mImageView.setImageBitmap(b);
}
});
}
})).start();
}
Для получения дополнительной информации
http://android-developers.blogspot.com/2009/05/painless-threading.html
http://www.aviyehuda.com/blog/2010/12/20/android-multithreading-in-a-ui-environment/