Поместите объект в сообщение Обработчик
Мне нужно загрузить изображение из Интернета,
в другой теме,
а затем отправить этот объект изображения в сообщении обработчика в поток пользовательского интерфейса.
У меня уже есть это:
...
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...
Может ли кто-нибудь помочь?
И, кстати, это самый эффективный способ
передать объект в поток пользовательского интерфейса?
Спасибо всем!
Ответы
Ответ 1
Я бы использовал 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);
}
}
Надеюсь, что поможет
Ответ 2
Я знаю, что опаздываю на вечеринку, но есть более простой способ, если вы используете сервис в рамках одного процесса. Вы можете присоединить любой произвольный Object
к вашему Message
, используя эту строку:
msg.obj = new CustomObject() // or whatever object you like
Это хорошо работает для меня в моих текущих проектах.
О, и я отхожу от использования объектов AsyncTask
, поскольку я считаю, что они слишком сильно увеличивают связь кода.
Ответ 3
Во-первых: Где именно вы получаете исключение? При установке экземпляра в пакет или его извлечении?
Я считаю, что вы смешиваете вещи. При создании своего пакета вы пишете
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
?
Ответ 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;
}
Наслаждайтесь:)