Проблема параллелизма Android - PullRequest
1 голос
/ 18 августа 2011

Я строго разделил слои между различными частями моего приложения для Android. В какой-то момент выполнения я обновляю свои данные из службы xml в Интернете. Это обновление занимает около 10 секунд и выполняется полностью в фоновом режиме, то есть пользовательский интерфейс приложения работает нормально. Однако дальнейшие обращения к моему классу (позже - DataManager), который отвечает за обновление данных (после того, как обновление было начато, но еще не закончено), вызывает сбой моего приложения. NullPointerException генерируется с объектами, которые НИКОГДА не равны нулю.

Итак, я предполагаю, что только один поток может использовать мой DataManager за один раз, и вызовы DataManager из других потоков заканчиваются исключениями.

Я пробовал различные комбинации размещения «синхронизированных» ключевых слов рядом с чувствительными методами, но кажется, что когда выполняется обновление - НИЧЕГО не может использовать НИЧЕГО из моего DataManager.

Кстати, другие классы, связанные с DataManager во время выполнения, также содержат нулевые объекты.

Полагаю, мне просто не хватает какого-то шаблона проектирования, который используется для решения проблем параллелизма, и, может быть, кто-нибудь может мне что-то подсказать?

1 Ответ

2 голосов
/ 18 августа 2011

У меня были проблемы с использованием HTTP-клиента Apache из-за проблем с многопоточностью, и я думаю, что ваша проблема может быть аналогичной в этом отношении.В итоге я настроил схему обратного вызова.Конечно, это может работать или не работать для вас.

Это может показаться вам немного похожим на Рубе Голдберга, но это сработало для меня.объект менеджера данных с методом, который порождал поток, чтобы пойти и получить данные.Возвращаемое значение метода - это объект, в котором ВСЕГДА были бы данные.Я хотел бы, чтобы моя деятельность расширяла интерфейс, что-то вроде «DataCallbackInterface», с помощью метода, который поток будет вызывать после получения данных (т. Е. Последней строки в run ()).Поскольку этот вызов по своей сути будет находиться в другом потоке, вам потребуется использовать обработчик для запуска чего-либо полезного в реализации метода DataCallbackInterface.Когда этот метод вызывается, вы будете точно знать, что данные есть, и не будете полагаться на какие-либо странные флаги синхронизации, чтобы получить их правильно.

...