Реализация обработчика-лупера в Android
- У меня есть активность с обработчиком (поток пользовательского интерфейса)
- Я запускаю новый поток и создаю handler.post(новый MyRunnable()) - (новый рабочий поток)
В документации Android говорится о методе post: "Заставляет Runnable r быть добавленным в очередь сообщений. Runnable будет запускаться в потоке, к которому подключен этот обработчик".
Обработчик подключен к потоку пользовательского интерфейса. Как Android может работать в одном потоке пользовательского интерфейса без создания нового потока?
Будет ли новый поток создан с использованием Runnable из handler.post()? Или это только метод run () будет вызываться из подкласса Runnable?
2 ответа
Обработчик подключен к потоку пользовательского интерфейса.
Правильный.
Как Android может работать в одном потоке пользовательского интерфейса без создания нового потока?
Любой поток, включая основной поток приложения ("UI"), может вызывать post() на Handler
(или на любом View
, в этом отношении).
Вот пример грубого псевдокода, как использовать обработчики - надеюсь, это поможет:)
class MyActivity extends Activity {
private Handler mHandler = new Handler();
private Runnable updateUI = new Runnable() {
public void run() {
//Do UI changes (or anything that requires UI thread) here
}
};
Button doSomeWorkButton = findSomeView();
public void onCreate() {
doSomeWorkButton.addClickListener(new ClickListener() {
//Someone just clicked the work button!
//This is too much work for the UI thread, so we'll start a new thread.
Thread doSomeWork = new Thread( new Runnable() {
public void run() {
//Work goes here. Werk, werk.
//...
//...
//Job done! Time to update UI...but I'm not the UI thread! :(
//So, let's alert the UI thread:
mHandler.post(updateUI);
//UI thread will eventually call the run() method of the "updateUI" object.
}
});
doSomeWork.start();
});
}
}