Inserisci un oggetto nel messaggio dell'Handler
-
25-09-2019 - |
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!
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 implementareParcelable
? (Credo di sì, altrimenti non sarebbe in grado di compilare) - Il il
object
variabile contiene un'istanza che implementaParcelable
?
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:)