将对象放入Handler消息中

时间:2010-06-09 09:31:08

标签: android handler parcelable

我需要从互联网上下载图片, 在另一个主题中,
然后将处理程序消息中的图像对象发送到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线程?

谢谢大家!

4 个答案:

答案 0 :(得分:67)

我知道我迟到了,但如果您在一个过程中使用该服务,则有一种更简单的方法。您可以使用以下行将任意Object附加到Message

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

在我目前的项目中,这对我很有用 哦,我正在逐渐停止使用AsyncTask个对象,因为我认为它们会增加代码耦合太多。

答案 1 :(得分:7)

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

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

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? (我想是的,否则你将无法编译)
  • 变量object是否包含实现Parcelable
  • 的实例

答案 2 :(得分:4)

我会使用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);
  }
}

希望有所帮助

答案 3 :(得分:2)

如果您只转发一个对象,则可以使用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;  
}

享受:)