22

我需要在不同的线程中从 Internet 下载图像,
然后在处理程序消息中将该图像对象发送到 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

4 回答 4

69

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

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

在我目前的项目中,这对我来说效果很好。
哦,我正在远离使用AsyncTask对象,因为我相信它们过多地增加了代码耦合。

于 2011-06-29T01:13:34.320 回答
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
于 2010-06-09T11:25:48.343 回答
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);
  }
}

希望有帮助

于 2010-06-09T09:44:43.370 回答
4

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

享受 :)

于 2017-08-03T07:45:50.317 回答