Domanda

Devo scaricare un'immagine da Internet, in un thread diverso,
e quindi inviare l'oggetto immagine nel messaggio del gestore al thread dell'interfaccia utente.

Ho già questo:

...
Message msg = Message.obtain();

Bundle b = new Bundle();
b.putParcelable("MyObject", (Parcelable) object);
msg.setData(b);

handler.sendMessage(msg);

E quando ricevo questo messaggio, voglio estrarre l'oggetto:

...
public void handleMessage(Message msg) {
    super.handleMessage(msg);

    MyObject objectRcvd = (MyObject) msg.getData().getParcelable("IpTile");
    addToCache(ipTile);
    mapView.invalidate();
}

Ma questo mi sta dando:

...java.lang.ClassCastException...

Qualcuno può aiutare?

E comunque, è questo il modo più efficiente?
passare un oggetto al thread dell'interfaccia utente?

Grazie a tutti!

È stato utile?

Soluzione

Utilizzerei un AsyncTask per questo tipo di operazione.Ti consente di collegarti al thread dell'interfaccia utente per cose come gli aggiornamenti sui progressi e una volta terminato il download.L'esempio seguente mostra come si dovrebbe fare:

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);
  }
}

Spero possa aiutare

Altri suggerimenti

Lo so, sono in ritardo alla festa, ma c'è un modo più semplice se si utilizza il servizio all'interno di un unico processo. È possibile allegare qualsiasi Object arbitrario al Message utilizzando questa linea:

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

Questa è lavorare bene per me nei miei progetti in corso.
Oh, e mi sto muovendo lontano da utilizzando oggetti AsyncTask, come credo aumentano codice di accoppiamento troppo.

Per prima cosa: Dove esattamente cosa si ottiene l'eccezione? Quando mettere l'istanza nel fascio, o su recuperarlo?

Credo che le tue cose mescolando. Quando si crea il pacchetto, si scrive

b.putParcelable("MyObject", (Parcelable) object);

Quindi, si sta assegnando l'istanza "objet" al "MyObject" chiave. Ma durante il recupero l'istanza si scrive:

MyObject objectRcvd = (MyObject) msg.getData().getParcelable("IpTile");

Qui, si recupera un'istanza dal "IpTile" chiave. Si noti che "IpTile" != "MyObject". Provare a utilizzare il seguente per recuperare l'oggetto:

MyObject objectRcvd = (MyObject) msg.getData().getParcelable("MyObject");

o viceversa, provare a sostituire il codice che mette l'istanza in bundle con questo:

b.putParcelable("IpTile", (Parcelable) object);

Ancora pochi punti da controllare:

  • Fa la MyObject classe implementare Parcelable? (Credo di sì, altrimenti non sarebbe in grado di compilare)
  • Il il object variabile contiene un'istanza che implementa Parcelable?

Se si sta inoltrando un solo oggetto, è possibile farlo utilizzando la classe del messaggio, non è necessario per creare un fascio -. È più facile e più veloce

Object myObject = new Object();
Message message = new Message();
message.obj = myObject;
message.what = 0;

mHandler.sendMessage(message); 

recuperarlo classicaly

@Override
public void handleMessage(Message msg) {
    super.handleMessage(msg);

    // ...
    Object object = (Object) msg.obj;  
}

Enjoy:)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top