把一个对象放在Handler消息中

我需要从互联网下载一个图像,在另一个线程,
然后将处理程序消息中的图像对象发送到UI线程。

我已经有这个:

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

当我收到这条消息时,我想提取对象:

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

但这是给我的:

 ...java.lang.ClassCastException... 

谁能帮忙?

顺便说一句,这是最有效的方法
将对象传递给UI线程?

谢谢你们!

Solutions Collecting From Web of "把一个对象放在Handler消息中"

我会使用一个AsyncTask这种操作。 它可以让你挂钩到你的UI线程中,例如进度更新和完成下载。 下面的例子显示了应该如何做:

 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); } } 

希望有所帮助

我知道我迟到了,但是如果你在一个单独的过程中使用这个服务,那么有一个更简单的方法。 您可以使用以下这行代码将任意Object附加到您的Message

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

在我目前的项目中,这对我来说很好。
哦,我不再使用AsyncTask对象,因为我相信他们会增加代码耦合太多。

首先:你究竟在哪里得到例外? 将实例放入包中,还是检索它?

我相信你把事情搞混了 创build你的包时,你写

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

因此,您将实例“ objet ”分配给键“ MyObject ”。 但是当你检索你的实例时,你会写:

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

在这里,您正在从“ IpTile ”键中检索实例。 请注意"IpTile" != "MyObject" 。 尝试使用以下来检索对象:

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

或者相反,尝试replace你的代码,把这个实例放到这个包中:

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

还有几点要检查:

  • MyObject类是否实现Parcelable ? (我想是这样,否则你将无法编译)
  • variablesobject是否包含实现Parcelable的实例?

如果只转发一个对象,则可以使用Message类来完成,不需要创build一个包 – 它更简单快捷。

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

检索它classicy

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

请享用 :)