Mettez un objet dans le message Manipulateur

J'ai besoin de télécharger une image sur Internet, dans un fil différent,
Puis envoyer cet objet d'image dans le message du gestionnaire, au thread UI.

J'ai déjà ceci:

... Message msg = Message.obtain(); Bundle b = new Bundle(); b.putParcelable("MyObject", (Parcelable) object); msg.setData(b); handler.sendMessage(msg); 

Et lorsque je reçois ce message, je veux extraire l'objet:

 ... public void handleMessage(Message msg) { super.handleMessage(msg); MyObject objectRcvd = (MyObject) msg.getData().getParcelable("IpTile"); addToCache(ipTile); mapView.invalidate(); } 

Mais cela me donne:

 ...java.lang.ClassCastException... 

Quelqu'un peut-il aider?

Et en passant, c'est le moyen le plus efficace
Transmettre un objet à la thread UI?

Merci à tous!

4 Solutions collect form web for “Mettez un objet dans le message Manipulateur”

J'utiliserais un AsyncTask pour ce type d'opération. Il vous permet de vous connecter à votre thread ui pour des mises à jour de progrès et une fois que vous avez terminé votre téléchargement. L'exemple ci-dessous montre comment on doit faire:

 class GetImageTask extends AsyncTask<String, int[], Bitmap> { @Override protected Bitmap doInBackground(String... params) { Bitmap bitmap = null; // Anything done here is in a seperate thread to the UI thread // Do you download from here // If you want to update the progress you can call publishProgress(int progress); // This passes to the onProgressUpdate method return bitmap; // This passes the bitmap to the onPostExecute method } @Override protected void onProgressUpdate(Integer... progress) { // This is on your UI thread, useful if you have a progressbar in your view } @Override protected void onPostExecute(Bitmap bitmapResult) { super.onPostExecute(bitmapResult); // This is back on your UI thread - Add your image to your view myImageView.setImageBitmap(bitmapResult); } } 

J'espère que cela pourra aider

Je sais que je suis en retard à la fête, mais il y a un moyen plus simple si vous utilisez le service dans un seul processus. Vous pouvez attacher un Object arbitraire à votre Message utilisant cette ligne:

 msg.obj = new CustomObject() // or whatever object you like 

Cela fonctionne bien pour moi dans mes projets actuels.
Oh, et je m'éloigne de l'utilisation des objets AsyncTask , car je crois qu'ils augmentent trop le couplage de code.

Premièrement: où est-ce que vous obtenez exactement l'exception? Lorsque vous mettez l'instance dans le paquet, ou après la récupérer?

Je crois que vous mélangez. Lorsque vous créez votre paquet, vous écrivez

 b.putParcelable("MyObject", (Parcelable) object); 

Donc, vous attribuez l'instance " objet " à la clé " MyObject ". Mais lorsque vous récupérez votre instance, vous écrivez:

 MyObject objectRcvd = (MyObject) msg.getData().getParcelable("IpTile"); 

Ici, vous récupérez une instance de la clé " IpTile ". Notez que "IpTile" != "MyObject" . Essayez d'utiliser ce qui suit pour récupérer l'objet:

 MyObject objectRcvd = (MyObject) msg.getData().getParcelable("MyObject"); 

Ou inversement, essayez de remplacer votre code qui met l'instance dans le paquet avec ceci:

 b.putParcelable("IpTile", (Parcelable) object); 

Quelques points à vérifier:

  • Est-ce que la classe MyObject implémente Parcelable ? (Je suppose que oui, sinon vous ne pourrez pas compiler)
  • L' object variable contient-il une instance qui implémente Parcelable ?

Si vous ne transmetz qu'un seul objet, vous pouvez le faire à l'aide de la classe Message, vous n'avez pas besoin de créer un paquet, c'est plus facile et plus rapide.

 Object myObject = new Object(); Message message = new Message(); message.obj = myObject; message.what = 0; mHandler.sendMessage(message); 

Récupérez le classicisme

 @Override public void handleMessage(Message msg) { super.handleMessage(msg); // ... Object object = (Object) msg.obj; } 

Prendre plaisir 🙂

coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.