2014-08-31 2 views
0

Просьба просить совета, я новичок в программировании на Android.Android: Делайте потоки поочередно поочередно в AlarmBroarcastReceiver

Я пишу программу, напоминающую будильник, и использую открытый класс AlarmManagerBroadcastReceiver расширяет BroadcastReceiver , чтобы поймать тревоги, установленные ранее AlarmManager.
Чтобы не прерывать пользовательский интерфейс, я использую новый поток в public void onReceive (контекст контекста, намерение намерения) этого класса. Обычно это выглядит следующим образом:

общественного класса AlarmManagerBroadcastReceiver расширяет BroadcastReceiver {

public void onReceive(Context context, Intent intent) { 

     Executors.newSingleThreadExecutor().submit(new Runnable() { 
        public void run() { 
          ... //useful code 
     } 
} 

}

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

Я хочу, чтобы потоки вошли в очередь и запускались один за другим. Не могли бы вы быть любезны советом, если вы столкнулись с этим раньше, есть ли способ, которым я могу это сделать?

Насколько я понимаю, проблема заключается в том, что я делаю Исполнителей. newSingleThreadExecutor() всякий раз, когда появляется трансляция, поэтому создается новый исполнитель, и поток приходит не в очередь старого, а в новую очередь, поэтому они снова запускаются одновременно.

ответ

0

Создайте SingleThreadExecutor в конструкторе; затем, в onReceive, передайте новый Runnable этому SingleThreadExecutor, который у вас уже есть.

public class AlarmManagerBroadcastReceiver extends BroadcastReceiver { 

    private ExecutorService executor; 

    public AlarmManagerBroadcastReceiver { 
    executor = Executors.newSingleThreadExecutor(); 
    } 

    public void onReceive(Context context, Intent intent) { 

    executor.submit(new Runnable() { 
       public void run() { 
         ... //useful code 
    } 
} 
+0

Это работает! Спасибо, человек, я думаю, у меня есть чему поучиться, но я не совсем понимаю, почему он работает. еще раз благодарю вас и у вас отличный день. – lxs

+0

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

+0

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

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