Autore Topic: Parcelable al posto di Serializable  (Letto 1369 volte)

Offline Sirio22

  • Utente junior
  • **
  • Post: 93
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Sistema operativo:
    Windows 7/8.1
Parcelable al posto di Serializable
« il: 19 Novembre 2010, 14:41:15 CET »
0
Leggevo il post di Ricky quando mi sono detto ok sostituisco Serializable con Parcelable

però mi sa che sbaglio qualcosa

------------con Serializable------------

Classe da mandare
Codice (Java): [Seleziona]
public class Negozio implements Serializable ,Comparable<Negozio>{
}

Classe che manda

Codice (Java): [Seleziona]
                        intentSchedaNegozio.putExtra(pkg+".myStore", storeActual);  
                                        startActivity(intentSchedaNegozio);

Classe che riceve

Codice (Java): [Seleziona]
        intent=getIntent();    
                Negozio provaNegozio=(Negozio)intent.getSerializableExtra(pkg+".myStore");

---------------------Con Parcelable-------------------

classe da mandare
Codice (Java): [Seleziona]
public class Negozio implements Parcelable,Comparable<Negozio>{


        @Override
        public int describeContents() {
                // TODO Auto-generated method stub
                return 0;
        }
        @Override
        public void writeToParcel(Parcel dest, int flags) {
                // TODO Auto-generated method stub
               
        }

classe che manda resta uguale

classe che riceve

Codice (Java): [Seleziona]
                intent=getIntent();    
                Negozio provaNegozio=(Negozio)intent.getParcelableExtra(pkg+".myStore");


L'errore che ricevo è



11-19 13:40:46.277: ERROR/AndroidRuntime(395): Uncaught handler: thread main exiting due to uncaught exception
11-19 13:40:46.297: ERROR/AndroidRuntime(395): java.lang.RuntimeException: Unable to start activity ComponentInfo{org.project/org.project.SchedaNegozioActivity}: android.os.BadParcelableException: Parcelable protocol requires a Parcelable.Creator object called  CREATOR on class org.util.Negozio
11-19 13:40:46.297: ERROR/AndroidRuntime(395):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496)
11-19 13:40:46.297: ERROR/AndroidRuntime(395):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
11-19 13:40:46.297: ERROR/AndroidRuntime(395):     at android.app.ActivityThread.access$2200(ActivityThread.java:119)
11-19 13:40:46.297: ERROR/AndroidRuntime(395):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
11-19 13:40:46.297: ERROR/AndroidRuntime(395):     at android.os.Handler.dispatchMessage(Handler.java:99)
11-19 13:40:46.297: ERROR/AndroidRuntime(395):     at android.os.Looper.loop(Looper.java:123)
11-19 13:40:46.297: ERROR/AndroidRuntime(395):     at android.app.ActivityThread.main(ActivityThread.java:4363)
11-19 13:40:46.297: ERROR/AndroidRuntime(395):     at java.lang.reflect.Method.invokeNative(Native Method)
11-19 13:40:46.297: ERROR/AndroidRuntime(395):     at java.lang.reflect.Method.invoke(Method.java:521)
11-19 13:40:46.297: ERROR/AndroidRuntime(395):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
11-19 13:40:46.297: ERROR/AndroidRuntime(395):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
11-19 13:40:46.297: ERROR/AndroidRuntime(395):     at dalvik.system.NativeStart.main(Native Method)
11-19 13:40:46.297: ERROR/AndroidRuntime(395): Caused by: android.os.BadParcelableException: Parcelable protocol requires a Parcelable.Creator object called  CREATOR on class org.util.Negozio
11-19 13:40:46.297: ERROR/AndroidRuntime(395):     at android.os.Parcel.readParcelable(Parcel.java:1831)
11-19 13:40:46.297: ERROR/AndroidRuntime(395):     at android.os.Parcel.readValue(Parcel.java:1713)
11-19 13:40:46.297: ERROR/AndroidRuntime(395):     at android.os.Parcel.readMapInternal(Parcel.java:1947)
11-19 13:40:46.297: ERROR/AndroidRuntime(395):     at android.os.Bundle.unparcel(Bundle.java:169)
11-19 13:40:46.297: ERROR/AndroidRuntime(395):     at android.os.Bundle.getParcelable(Bundle.java:1037)
11-19 13:40:46.297: ERROR/AndroidRuntime(395):     at android.content.Intent.getParcelableExtra(Intent.java:3269)
11-19 13:40:46.297: ERROR/AndroidRuntime(395):     at org.project.SchedaNegozioActivity.onCreate(SchedaNegozioActivity.java:91)
11-19 13:40:46.297: ERROR/AndroidRuntime(395):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
11-19 13:40:46.297: ERROR/AndroidRuntime(395):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
11-19 13:40:46.297: ERROR/AndroidRuntime(395):     ... 11 more

dove sbaglio?
Let Your Brain Run Away

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Parcelable al posto di Serializable
« Risposta #1 il: 19 Novembre 2010, 15:05:18 CET »
+1
L'esempio ufficiale è abbastanza esplicativo:

Parcelable | Android Developers

Devi inserire un apposito campo chiamato CREATOR, guarda l'esempio che capisci ;)

Offline Sirio22

  • Utente junior
  • **
  • Post: 93
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Sistema operativo:
    Windows 7/8.1
Re:Parcelable al posto di Serializable
« Risposta #2 il: 19 Novembre 2010, 15:16:13 CET »
0
Era proprio quello non pensavo fosse indispensabile
Grazie Ricky.  ;-)

A chi dovesse servire posto la soluzione

Codice (Java): [Seleziona]
    public static final Parcelable.Creator<Negozio> CREATOR
    = new Parcelable.Creator<Negozio>() {
public Negozio createFromParcel(Parcel in) {
    return new Negozio();
}
anche se in effetti basterebbe andare nel link di Ricky :) ma tutto fa brodo!
Let Your Brain Run Away

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Parcelable al posto di Serializable
« Risposta #3 il: 19 Novembre 2010, 15:23:33 CET »
0
Era proprio quello non pensavo fosse indispensabile
Grazie Ricky.  ;-)

A chi dovesse servire posto la soluzione

Codice (Java): [Seleziona]
    public static final Parcelable.Creator<Negozio> CREATOR
    = new Parcelable.Creator<Negozio>() {
public Negozio createFromParcel(Parcel in) {
    return new Negozio();
}
anche se in effetti basterebbe andare nel link di Ricky :) ma tutto fa brodo!

Mi sa che non va bene così eh...
Nella createFromParcel devi ricostruire l'oggetto (come fanno nell'esempio) altrimenti non funziona il meccanismo!
Non basta dichiarare il metodo, devi anche implementarlo..

Offline Sirio22

  • Utente junior
  • **
  • Post: 93
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Sistema operativo:
    Windows 7/8.1
Re:Parcelable al posto di Serializable
« Risposta #4 il: 19 Novembre 2010, 15:27:42 CET »
0
Ah ecco a me funzionava perchè usavo un oggetto con parametri settati di default, non ho provato a usarlo con parametri ad hoc. Ci lavoro un po' su grazie ancora.
Let Your Brain Run Away

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Parcelable al posto di Serializable
« Risposta #5 il: 19 Novembre 2010, 15:33:28 CET »
0
Ah ecco a me funzionava perchè usavo un oggetto con parametri settati di default, non ho provato a usarlo con parametri ad hoc. Ci lavoro un po' su grazie ancora.

Se hai problemi chiedi pure :)

Offline Sirio22

  • Utente junior
  • **
  • Post: 93
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Sistema operativo:
    Windows 7/8.1
Re:Parcelable al posto di Serializable
« Risposta #6 il: 19 Novembre 2010, 15:36:13 CET »
0
Codice (Java): [Seleziona]
private void readFromParcel(Parcel in) {
                this.clear();
               
                //leggiamo la dimensione che è il primo elemento ad essere stato scritto
                int size = in.readInt();

Questo è tuo :) i parametri vengono letti in ordine in base a come sono stati written?
Let Your Brain Run Away

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Parcelable al posto di Serializable
« Risposta #7 il: 19 Novembre 2010, 15:37:21 CET »
0
i parametri vengono letti in ordine in base a come sono stati written?

Assolutamente :)

Offline Sirio22

  • Utente junior
  • **
  • Post: 93
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Sistema operativo:
    Windows 7/8.1
Re:Parcelable al posto di Serializable
« Risposta #8 il: 19 Novembre 2010, 15:44:09 CET »
0
Codice (Java): [Seleziona]
        public Negozio (Parcel in){


                nome=in.readString();
                CAP=in.readInt();
                Citta=in.readString();
                Provincia=in.readString();
                indirizzo=in.readString();
                mediaQualita=in.readDouble();
                votanti=in.readInt();
                coordinate=in.readString();
                numTelefono=in.readString();

                mediaPrezzo=in.readDouble();
                numCellulare=in.readString();
                criterioRicerca=in.readString();
                coordinate=in.readString();
                distRelativaInt=in.readInt();
                distRelativaString=in.readString();

        }

        public Negozio(){

        }
       
        public static final Parcelable.Creator<Negozio> CREATOR
        = new Parcelable.Creator<Negozio>() {
                public Negozio createFromParcel(Parcel in) {
                        return new Negozio(in);
                }

                public Negozio[] newArray(int size) {
                        return new Negozio[size];
                }
        };

        @Override
        public void writeToParcel(Parcel out, int flags) {

                out.writeString(nome);
                out.writeInt(CAP);
                out.writeString(Citta);
                out.writeString(Provincia);
                out.writeString(indirizzo);
                out.writeDouble(mediaQualita);
                out.writeInt(votanti);
                out.writeString(coordinate);
                out.writeString(numTelefono);

                out.writeDouble(mediaPrezzo);
                out.writeString(numCellulare);
                out.writeString(criterioRicerca);
                out.writeString(coordinate);
                out.writeInt(distRelativaInt);
                out.writeString(distRelativaString);

        }

dopo un estenuante lavoro funge! Ringrazio ancora Ricky! :-)
Let Your Brain Run Away

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Parcelable al posto di Serializable
« Risposta #9 il: 19 Novembre 2010, 16:03:47 CET »
0
Si effettivamente è una rottura di balle scrivere e leggere tutti gli attributi :)