Есть 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;
}
}
BroadcastReceiver зарегистрирован в манифесте, и мне нужно решить проблему, при которой широковещательная передача смены сети запускается дважды или трижды на некоторых устройствах. Я думал об использовании переменной уровня класса. Теперь я подумываю об использовании SharedPreferences и сохранении там «isFirstTrigger», а затем установлю его false после завершения обработки. Но не уверен, что это будет работать или нет (в случае создания новых экземпляров и вызова до завершения первого вызова). Какие-либо предложения? – Manish
@Manish: ваш процесс * вероятно * будет оставаться в течение нескольких секунд после трансляции, и поэтому вы можете уйти со статическим членом данных. В противном случае вам нужно будет его сохранить, будь то в «SharedPreferences» или в другом месте. – CommonsWare
Спасибо @CommonsWare, моя забота об использовании SharedPreferences: Если создаются несколько экземпляров BroadcastReceivers, не будут ли они одновременно обращаться к SharedPreference? Может случиться так, что второй и третий вызов onRecieve() происходят до первого вызова, обновляет SharedPreference. – Manish