我需要从互联网上下载图片,
在另一个主题中,
然后将处理程序消息中的图像对象发送到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线程?
谢谢大家!
答案 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;
}
享受:)