将对象放入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 { @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对象,因为我相信它们会增加代码耦合太多。

第一:你究竟在哪里获得例外? 将实例放入包中或检索它时?

我相信你的混合了。 创建捆绑包时,请编写

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

因此,您将实例“ objet ”分配给键“ MyObject ”。 但在检索您的实例时,您写道:

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

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

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

或者反过来,尝试替换将实例放入包中的代码:

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

另外几点要检查:

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

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

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

经典地检索它

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

请享用 :)