2013-09-06 3 views
5

Есть onReceive() метод BroadcastReceiver потокобезопасный или мне нужно реализовать синхронизацию самостоятельно?BroadcastReceiver onReceive() потокобезопасный?

Если у меня есть переменная уровня класса, которая используется внутри метода onReceive(), а метод onReceive() вызывается несколько раз очень быстро, это вызовет проблему?

public class MyBroadCastReceiver extends BroadcastReceiver { 

    boolean isFirstTrigger = true; 

    @Override 
    public void onReceive(Context context, Intent arg1) { 
     if(isFirstTrigger) 
     { 
     //Do something time consuming 
     isFirstTrigger = false; 
     } 
     } 

ответ

7

Является ли метод OnReceive() из BroadcastReceiver Потокобезопасного или мне нужно реализовать синхронизацию самостоятельно?

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

Если у меня есть переменная уровня класса, которая используется внутри метода onReceive(), а метод onReceive() вызывается несколько раз очень быстро, это вызовет проблему?

Если в манифесте зарегистрирован BroadcastReceiver, для каждой трансляции создается новый экземпляр. Вот почему вы обычно не видите данные на BroadcastReceiver.

+0

BroadcastReceiver зарегистрирован в манифесте, и мне нужно решить проблему, при которой широковещательная передача смены сети запускается дважды или трижды на некоторых устройствах. Я думал об использовании переменной уровня класса. Теперь я подумываю об использовании SharedPreferences и сохранении там «isFirstTrigger», а затем установлю его false после завершения обработки. Но не уверен, что это будет работать или нет (в случае создания новых экземпляров и вызова до завершения первого вызова). Какие-либо предложения? – Manish

+0

@Manish: ваш процесс * вероятно * будет оставаться в течение нескольких секунд после трансляции, и поэтому вы можете уйти со статическим членом данных. В противном случае вам нужно будет его сохранить, будь то в «SharedPreferences» или в другом месте. – CommonsWare

+0

Спасибо @CommonsWare, моя забота об использовании SharedPreferences: Если создаются несколько экземпляров BroadcastReceivers, не будут ли они одновременно обращаться к SharedPreference? Может случиться так, что второй и третий вызов onRecieve() происходят до первого вызова, обновляет SharedPreference. – Manish

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