В моем приложении для Android у меня есть ListActivity. Этот ListActivity использует SimpleAdapter, который я заполняю элементами из своего сервиса. Итак, в моем коде я делаю:
MySuperCoolService.Binder serviceBinder = null;
private ServiceConnection serviceConnection = new ServiceConnection()
{
public void onServiceConnected(ComponentName className, IBinder service) {
Log.d(TAG, "Service connection: connected!");
serviceBinder = (MySuperCoolService.Binder)service;
}
public void onServiceDisconnected(ComponentName className) {
Log.d(TAG, "Service connection: disconnected");
serviceBinder = null;
}
};
bindService(new Intent(this, MySuperCoolService.class), serviceConnection, BIND_AUTO_CREATE);
while(serviceBinder==null) {
Thread.Sleep(1000);
}
// now retrieve from service using binder and set list adapter
Вся эта операция занимает совсем немного времени (менее секунды), поэтому я хочу, чтобы она выполнялась в потоке пользовательского интерфейса. Смотрите мой onCreate:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
fillDataUsingCodeAbove();
}
Причина, по которой я хочу, чтобы это выполнялось в потоке пользовательского интерфейса, заключается в том, что если у вас выбран элемент списка, или вы прокрутили до определенной позиции в ListView, и вы поворачиваете устройство или вынимаете клавиатуру или что-то вызвать изменение конфигурации), когда моя активность будет перезапущена, Android попытается восстановить состояние сразу после onCreate. Но если я запускаю его в отдельном потоке, он не будет. Также есть классная анимация fadein:)
Проблема, с которой я столкнулся при запуске в потоке пользовательского интерфейса, заключается в том, что при попытке привязки к службе этот запрос на привязку службы помещается в очередь сообщений. Но затем, когда я захожу в цикл, я прекращаю цикл сообщений. Так что моя программа зависает, потому что она ожидает привязки службы, и служба не будет привязана, пока цикл не завершится. Я думал о том, чтобы поместить Looper.loop()
в мой цикл, но он просто повесил его на Looper.loop()
(я не знаю почему.)
Извините за такой длинный вопрос,
Исаак Уоллер