2009-11-09 3 views
0

Dans une activité, j'ai un certain bout de code qui se déclenche au large un message:Pourquoi mon paquet à l'intérieur de android.os.Message est-il réinitialisé?

 Message m = _handler.obtainMessage(UPDATE_PROGRESS); 
     Bundle bundle = new Bundle(); 
     bundle.putInt(BUNDLE_KEY, 50); 
     m.setData(bundle); 
     Log.d(LOG_TAG, "value " + bundle.getInt(BUNDLE_KEY, 0)); // prints 50 
     Log.d(LOG_TAG, "sent:" + _handler.sendMessage(m)); // prints true 

Dans une autre partie de l'activité, je traitais comme ceci:

public void handleMessage(final android.os.Message msg) 
    { 
     switch(msg.what) 
     { 
     case UPDATE_PROGRESS: 
      post(new Runnable() 
      { 
       @Override 
       public void run() 
       { 
        Bundle aBundle = msg.getData(); 
        Log.d(LOG_TAG, "value in bundle=" + 
         aBundle.getInt(BUNDLE_KEY, 0)); // prints 0 

        Log.d(LOG_TAG, "contains 'progress' : " + 
         aBundle.containsKey(BUNDLE_KEY)); // prints 'false' 

       } 
      }); 
      break; 
      } 

Pourquoi le Bundle pas conservé dans le message? Qui réinitialise les valeurs du Bundle?

Répondre

1

Le problème est résolu. Fondamentalement, dans la méthode handleMessage, n'emballez pas le lambdas dans un runnable. Exécutez vos modifications in-situ.

2

Je sais que c'est un ancien thread, mais comme j'ai eu un problème similaire en utilisant un Handler avec HandlerThread, je voulais ajouter quelques informations sur la façon dont je l'ai résolu. J'ai remarqué que le contenu de mon instance de message était effacé de façon sporadique après l'appel de quitter sur HandlerThread. Pour le réparer, j'ai fait une copie de l'objet Message dans le callback handleMessage avec une nouvelle référence en utilisant: Message msgCopy = Message.obtain(msg);.

0

Au cas où quelqu'un trouve autre cette question en essayant de résoudre le même problème que moi:

Si vous créez un message comme si (par exemple, la fixation d'un paquet comme obj de message):

Bundle myBundle = new Bundle(); 
myBundle.putString("CODE", "code"); 

//send bundle to target 
handlerOfTarget.obtainMessage(MESSAGE_TRIGGER_RECEIVED, 0, 0, myBundle).sendToTarget(); 

(Où handlerOfTarget est une référence à la gestionnaire de la cible)

Et en essayant de recevoir le paquet comme celui-ci:

@Override 
public void handleMessage(Message msg) { 

    case MESSAGE_TRIGGER_RECEIVED: 
     Bundle myBundle = msg.getData(); 
     String code = myBundle.getString("CODE"); //null 

     ... 

Le problème est que msg.getData() n'obtient pas le paquet défini comme objet du message.

Pour ce faire, vous devez utiliser:

@Override 
public void handleMessage(Message msg) { 

    case MESSAGE_TRIGGER_RECEIVED: 
     Bundle myBundle = (Bundle) msg.obj; 
     String code = myBundle.getString("CODE"); //null 

     ... 
Questions connexes