Android Загрузка списка просмотра элементов из сервиса приводит к зависанию - PullRequest
0 голосов
/ 20 мая 2009

В моем приложении для 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() (я не знаю почему.)
Извините за такой длинный вопрос,
Исаак Уоллер

1 Ответ

0 голосов
/ 10 июня 2010

Я думаю, что вы должны использовать AsyncTask , он не найдет поток пользовательского интерфейса и не будет намного сложнее, чем у вас уже есть.

...