EventListener avec multi-thread
Bonjour à tous !
Depuis un petit moment j'essaye de générer un évènement sur la réception d'un sms.
Voici le code de l'interface de de mon listener
Code:
1 2 3 4
|
public interface MessageListener{
void messageRecu(String numero, String message);
} |
Là voici la classe qui va recevoir le sms :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
|
public class Messager extends BroadcastReceiver {
private static final String EN_TETE = "[EnqueteSpecialeMessage]";
private final String ACTION_RECEIVE_SMS = "android.provider.Telephony.SMS_RECEIVED";
// Collection d'écouteurs d'évènements
private final Collection<MessageListener> _messageListeners = new ArrayList<MessageListener>();
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(ACTION_RECEIVE_SMS)) {
Bundle bundle = intent.getExtras();
if (bundle != null) {
Object[] pdus = (Object[]) bundle.get("pdus");
final SmsMessage[] messages = new SmsMessage[pdus.length];
for (int i = 0; i < pdus.length; i++) {
messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
}
if (messages.length > -1) {
final String messageBody = messages[0].getMessageBody();
final String phoneNumber = messages[0]
.getDisplayOriginatingAddress();
if (messageBody.startsWith(EN_TETE)) {
// On lance l'évennement sur les listener
fireMessageReceived(phoneNumber,
messageBody.substring(EN_TETE.length()));
// On supprime le message
abortBroadcast();
}
}
}
}
}
public void addMessageListener(MessageListener listener) {
_messageListeners.add(listener);
}
public void removeMessageListener(MessageListener listener) {
_messageListeners.remove(listener);
}
public Collection<MessageListener> getMessageListeners() {
return _messageListeners;
}
protected void fireMessageReceived(String numero, String message) {
for (MessageListener listener : _messageListeners) {
listener.messageRecu(numero, message);
}
}
} |
Et là j'ajoute une instance de mon listener à ma classe
Code:
1 2 3 4 5 6 7 8 9
|
_messager.addMessageListener(new MessageListener() {
@Override
public void messageRecu(String numeroExpediteur,
String contenuMessage) {
message.setText("Numéro : " + numeroExpediteur
+ "\nMessage : " + contenuMessage);
}
}); |
Le problème c'est que lorsque je reçois un sms, j'appelle bien fireMessageReceived() mais _messageListeners est vide.
Je pense que c'est dû au fait que la création de l'instance et le déclenchement de l'évènement se réalise sur deux threads différents .
Voilà je ne sais pas comment résoudre le problème