Autore Topic: Problema nel passaggio di un Object da un Activity ad un altra tramite putExtra  (Letto 723 volte)

Offline n3tmaster

  • Utente junior
  • **
  • Post: 96
  • Respect: 0
    • Google+
    • lerocchi
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4 - Nexus 7 - PadFone JB
  • Sistema operativo:
    Mac OSX 10.7
Salve a tutti, sono nuovo del forum, sono uno sviluppatore Java di vecchia data che si sta affacciando da poco al mondo Android...e mi sto scontrando con un problema un pò strano...
Io ho un'activity che richiama un'altra tramite un Intent esplicito. Ho la necessita di passare alla nuova Activity il reference di una classe che istanzio dentro l'activity padre. Per far ciò ho implementato Serializzable sulla mia classe e poi l'ho passata a putExtra con l'intenzione di recuperarla attraverso il comando getSerializzableExtra().

Il problema è che questo approccio mi genera un'eccezione che non mi aspettavo.

Ricapitolando:
Questo è il codice della mia classe esterna, che una volta istanziata, voglio passare alla nuova activity:
Codice (Java): [Seleziona]
public class MapEntity implements Serializable{
        private String mapFile;
        private Bitmap questaBitmap;

        //Setter / Getter
       //..
       //..
}

Questa è la chiamata Intent che ho dichiarato nell'evento onClick() della mia Activity principale:
Codice (Java): [Seleziona]
         MapEntity miaMappa=new MapEntity();

         //...
         //...
         public void onClick(View arg0) {
                Intent intent = new Intent(SmartVActivity.this,LayersListActivity.class);
                intent.putExtra("mapEntity",miaMappa);
                startActivity(intent);
                }
        });
        //...
        //...

Questa infine è la onCreate() della seconda Activity alla quale passo l'istanza di MapEntity
Codice (Java): [Seleziona]
         MapEntity miaMappa;
         //...
         //...

         public void onCreate(Bundle savedInstanceState) {
                 super.onCreate(savedInstanceState);
                 setContentView(R.layout.layerslist);
             
                 //recupero il reference di miaMappa
                 Intent miaIntent = this.getIntent();
                 miaMappa = (MapEntity)miaIntent.getSerializableExtra("mapEntity");
         }

         //...
         //...

L'eccezione generata è la seguente

03-09 18:40:35.410: E/AndroidRuntime(369): java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = it.cnr.ibimet.SmartV.MapEntity)

e me la genera sull'istruzione startActivity(intent);

Vi ringrazio anticipatamente per l'aiuto.
Leandro Rocchi
Software Developer - Geodatabase Designer

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Se devi passare una classe che contiene una Bitmap ti conviene ( o meglio, devi :D ) implementare l'interfaccia Parcelable invece che Serializable.

Offline n3tmaster

  • Utente junior
  • **
  • Post: 96
  • Respect: 0
    • Google+
    • lerocchi
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4 - Nexus 7 - PadFone JB
  • Sistema operativo:
    Mac OSX 10.7
Ah, pensavo che bastasse Serializable, ma la Percelable si implementa nello stesso modo? ho visto che quell'interfaccia ha dei metodi astratti da implementare...mmmm
Leandro Rocchi
Software Developer - Geodatabase Designer

Offline n3tmaster

  • Utente junior
  • **
  • Post: 96
  • Respect: 0
    • Google+
    • lerocchi
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4 - Nexus 7 - PadFone JB
  • Sistema operativo:
    Mac OSX 10.7
Anyway..grazie per la celerissima risposta!!!  :D
Leandro Rocchi
Software Developer - Geodatabase Designer

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Ah, pensavo che bastasse Serializable, ma la Percelable si implementa nello stesso modo?

Più o meno, devi appunto implementare i metodi dell'interfaccia. Qui nella doc trovi un esempio: Parcelable | Android Developers
Sostanzialmente devi scrivere tu manualmente gli elementi che devi serializzare.

Offline n3tmaster

  • Utente junior
  • **
  • Post: 96
  • Respect: 0
    • Google+
    • lerocchi
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4 - Nexus 7 - PadFone JB
  • Sistema operativo:
    Mac OSX 10.7
Grazie! stasera proverò la soluzione :)
Leandro Rocchi
Software Developer - Geodatabase Designer

Offline n3tmaster

  • Utente junior
  • **
  • Post: 96
  • Respect: 0
    • Google+
    • lerocchi
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4 - Nexus 7 - PadFone JB
  • Sistema operativo:
    Mac OSX 10.7
Innanzitutto grazie del prezioso aiuto, mi hai illuminato la via !!


nella mia classe MapEntity ho implementato Parcelable, poi se ho capito bene
ho implementato un mio costruttore

Codice (Java): [Seleziona]
//costruttore
        private MapEntity(Parcel in) {
                mapFile = in.readString();
       
    }

e poi nel metodo writeToParcel ho messo

Codice (Java): [Seleziona]
@Override
        public void writeToParcel(Parcel arg0, int arg1) {
               
                arg0.writeString(mapFile);
        }      
       

e adesso funziona tutto, l'eccezione non appare piu e nella nuova Activity la mia classe viene passata (ho ferificato usando il getter di mapFile.
Chiaramente nella seconda Activity adesso uso il metodo getParcelableExtra anziché getSerializableExtra.

Grazie ancora!!!  :D

Adesso l'unica cosa che devo risolvere è come passare anche il mio attributo di tipo Bitmap, immagino che dovrò usare i metodi writeValue e readValue giusto?  :-P
Leandro Rocchi
Software Developer - Geodatabase Designer