2016-09-21 3 views
0

Я делаю приложение для Android и у меня есть пользовательский интерфейс, чтобы отображать некоторые данные, полученные с сервера. Данные сохраняются в db в контроллере. Когда приложение запускается, это то, что он делает:как предотвратить условия гонки в моем случае

  1. экземпляр контроллера инициализируется на резьбе Ui, это синглтон. Инициализация облегчается. Пользовательский интерфейс вызовет метод контроллера, чтобы получить данные, сохраненные в памяти, и показать их.
  2. с рабочим потоком для выполнения некоторого метода контроллера для чтения данных из db и сохранения его в кеше в памяти и уведомления об интерфейсе после его получения.
  3. всякий раз, когда есть какие-то новые данные, сервер отправляет push клиенту, где запущен intentservice, и контроллер разговаривает с сервером, чтобы получить данные и обновить кеш, и после того, как он будет завершен, это будет notifys UI.

Итак, вопрос 2 и 3, поскольку оба работают в разных потоках, поэтому, чтобы убедиться, что db необходимо сначала прочитать и сохранить в кеше, у меня есть флаг в 3), так что перед записывая новые данные в память, я всегда проверяю флаг первым. Он будет работать, но поскольку я могу предвидеть, что в кеше больше операций, возможно, пересекают разные потоки, и я действительно не хочу добавлять проверку флага во всех таких местах, поэтому у нас есть какой-либо шаблон/способ убедиться, что 2) всегда происходит первым?

жаль, что я не нашел на нем подобного сообщения. Благодарю.

ответ

0

хорошо сделать одну вещь, когда ваше заявление 2 завершено выполнение в последней строке кода вызова вещательный приемник и внутри onRecieve() метод, который находится внутри BroadcastReceiver выполнить инструкцию 3.

+0

3), который является попросив сервер получить новые данные. И это вызвано GCM. И для этого также потребуется флаг, чтобы указать внутри onReceive(), чтобы сказать, когда спросить сервер, не так ли? Если это так, то это будет очень похоже на использование флага для проверки db, если он загружен или нет, прежде чем запрашивать сервер. – supernewbie

+0

Нет, я думаю, что нет необходимости проверять флаг внутри onReceive(). Но вы должны запустить широковещательную рассылку, когда вы получите полный шаг 2 и готовы выполнить шаг 3. – redblood

+0

3) должен только разговаривать с сервером, когда GCM и мы никогда не знаем, когда будет получен gcm. поэтому как убедиться, что 2) завершено до 3)? – supernewbie