2012-06-21 7 views
1

гарантирован порядок трансляции? то есть, если я это сделаю,синхронные сообщения от уровня обслуживания до уровня пользовательского интерфейса

sendBroadcast(intent1); 
sendBroadcast(intent2); 

Получатели гарантированно получат намерение1 до намерения2? я подозреваю, что ответ на это нет, но в этом случае я не совсем уверен, как решить мою проблему.

Я пытаюсь создать индикатор «занят» для своего приложения, которое показывает занят, когда устройство говорит в сети, а затем уходит, когда сетевое общение завершено. вся сетевая связь происходит в службе намерений.

моя попытка состояла в том, чтобы отправить намерение BUSY_START, когда я начну сетевое общение в службе, и BUSY_STOP, когда закончится сетевая связь. это, по-видимому, в основном работает, но я иногда нахожусь, что я останавливаюсь и запускаю сообщения из строя.

есть ли лучший способ решить эту проблему?

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

ответ

0

Отвечая на мой собственный вопрос ...

По крайней мере, одна жизнеспособная альтернатива фактически является выполнение обмена сообщениями через класс приложений, т.е.

  1. создать интерфейс слушателя
  2. менеджер коллекция слушателей в приложении/предоставляют методы для добавления/удаления слушателя
  3. Заинтересованные лица называют методы приложения для добавления/удаления себя в качестве слушателей
  4. Добавить «оповещать» методы в приложении, которые вызывают соответствующий метод слушателя интерфейса на каждом из зарегистрированных слушателей
  5. Услуги называющих методы уведомления приложения к

Например,

public class MyApplication extends Application { 
    public interface MyListener { 
    void onEvent(); 
    } 

    private Set<MyListener> listeners = new HashSet<Listener>(); 

    public void addListener(MyListener l) { 
    listeners.add(l); 
    } 

    public void removeListener(MyListener l) { 
    listeners.remove(l); 
    } 

    public void sendEvent() { 
    for (MyListener l: listeners) { l.onEvent(); } 
    } 
} 

Теперь, от вашей активности (или его фрагмент),

public class MyActivity extends Activity implements MyListener { 
    ... 
    ... 
    ... 

    @Override 
    public void onEvent() { 
     // do something 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 

     ((MyApplication)getApplication()).addListener(this); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 

     ((MyApplication)getApplication()).removeListener(this); 
    } 
} 

И в службе,

((MyApplication)getApplication()).sendEvent(); 

Это обеспечивает синхронный обмен сообщениями без использования намерений или статических переменных.

+0

Этот код, как вы его представили, выглядит так, как будто он вызывает поток службы непосредственно в основной поток пользовательского интерфейса Activity. Это не-нет. Я действительно думаю, что вам нужен объект Handler, если вы хотите звонить из одного потока в другой. – mportuesisf

+0

Вы правы, так оно и есть. предполагается, что если активность изменяет поток пользовательского интерфейса в 'onEvent()', он должен это делать, используя 'runOnUIThread()'. структура обратного вызова могла бы скрыть это, если бы мы этого захотели, но я предпочел бы оставить это до потока пользовательского интерфейса, чтобы решить, нужен ли ему этот дополнительный шаг. –

+0

Хорошо, что вы упомянули о том, что для тех, кто хотел использовать ваш пример кода в своем приложении. – mportuesisf

0

Рассматривали ли вы использование объекта Handler для связи с фоновым потоком в IntentService? Преимущество Handler над подходом BroadcastReciver состоит в том, что Handler использует очередь сообщений для последовательности объектов Message.

(Я предполагаю, что ваша Служба находится в том же процессе, что и основной поток приложения).

+0

Я пытаюсь связаться с IntentService с потоком пользовательского интерфейса. –

+0

Yup. Обработчик должен сделать именно это. Или я чего-то не хватает? – mportuesisf

+0

, в этом случае вам нужно построить обработчик в действии и предоставить службе ссылку на него. Как ты это делаешь? –

Смежные вопросы