Подтвердить что ты не робот

Поместите объект в сообщение Обработчик

Мне нужно загрузить изображение из Интернета, в другой теме,
а затем отправить этот объект изображения в сообщении обработчика в поток пользовательского интерфейса.

У меня уже есть это:

...
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...

Может ли кто-нибудь помочь?

И, кстати, это самый эффективный способ передать объект в поток пользовательского интерфейса?

Спасибо всем!

4b9b3361

Ответ 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;  
}

Наслаждайтесь:)