Autore Topic: Passare un oggetto Parcelable contente un array di oggetti tra attività  (Letto 1267 volte)

Offline dharmadude

  • Nuovo arrivato
  • *
  • Post: 11
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows xp
Salve a tutti
Vorrei passare, da un'attività ad un altra, un'oggetto che ha come attributo un array di oggetti di un altra classe; per far ciò ho implementato per entrambe le classi l'interfaccia Parcelable, ma quando nell'attività chiamata chiedo l'oggetto questo ha valore null. Ma andiamo con ordine, richiamo l'activity e metto l'oggetto da passare nell'intent tramite

Codice (Java): [Seleziona]
i=new Intent(SoNActivity.this,OperationListAct.class);
i.putExtra("1", opSettings);
startActivityForResult(i, CommunicationConfig.getRequestCode(SoNActivity.class));

l'oggetto opSetting è di classe OperationSetting, che implementa l'interfaccia Parcelable e ha come attributo un vettore di oggetti di un'altra classe che a sua volta implementa Parcelable:

Codice (Java): [Seleziona]
public class OperationSetting implements Parcelable{
        public class OperationInfo implements Parcelable{
                private Operation mOperation;
                private boolean mActive;
                private int mPosition;
                private String mName;
                private String mDescription;
               
               
                public OperationInfo(boolean isAct,int pos,String name, String descr,Operation op){
                        mActive=isAct;
                        mPosition =pos;
                        mName=name;
                        mDescription=descr;
                        mActive=true;
                        mOperation=op;
                }
               
                public Operation getOperation(){return mOperation;}
                public boolean getActive(){return mActive;}
                public int getPosition(){return mPosition;}
                public String getName(){return mName;}
                public String getDescription(){return mDescription;}
               
                public void setOperation(Operation operation){mOperation=operation;}
                public void setActive(boolean active){mActive=active;}
                public void setPosition(int position){mPosition=position;}
                public void setName(String name){mName=name;}
                public void setDescription(String description){mDescription=description;}

                private String[] getAttList(){
                        String[] atts={"name","description","position","isEnabled","operation"};
                        return atts;
                }
               
               
               
                public int describeContents() {
                        return 0;
                }

                @Override
                public void writeToParcel(Parcel out, int flags) {
                        Bundle bndl=new Bundle();
                        String[] attList=this.getAttList();
                        bndl.putString(attList[0], mName);
                        bndl.putString(attList[1],mDescription);
                        bndl.putInt(attList[2],mPosition);
                        bndl.putBoolean(attList[3], mActive);
                        bndl.putString(attList[4], mOperation.toString());
                        out.writeBundle(bndl);
                       
                }
               
            public OperationInfo (Parcel in) {
                Bundle bndl = in.readBundle();
                String[] attList=this.getAttList();
                mName=bndl.getString(attList[0]);
                mDescription=bndl.getString(attList[1]);
                mPosition=bndl.getInt(attList[2]);
                mActive=bndl.getBoolean(attList[3]);
                mOperation=Operation.valueOf(bndl.getString(attList[4]));
            }
             
            public final Parcelable.Creator<OperationInfo> CREATOR = new Parcelable.Creator<OperationInfo>() {
                     public OperationInfo createFromParcel(Parcel in) {
                         return new OperationInfo(in);
                     }

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

       
        }
       
        private OperationInfo[] m_settings;
       
       
       
        public OperationSetting (String[] namesOp,String[] descrOp,int[] positions, boolean[] enabled,boolean firstExec){
                Operation[] opList=Operation.values();
                m_settings=new OperationInfo[opList.length];
                for(int i=0;i<opList.length;i++){
                        m_settings[i]=new OperationInfo(enabled[i], positions[i], namesOp[i], descrOp[i], opList[i]);
                }
                if(firstExec){
                        String[] newOrder=namesOp.clone();
                        Arrays.sort(newOrder);
                        this.sort(newOrder);
                }
        }

        @Override
        public int describeContents() {
                return 0;
        }

        @Override
        public void writeToParcel(Parcel dest, int flags) {
                dest.writeParcelableArray(m_settings, flags);
        }
       
    public OperationSetting(Parcel in) {
        m_settings = (OperationInfo[]) in.readParcelableArray(OperationInfo.class.getClassLoader());
       
    }

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

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


}


Invece nell'attività chiamata per prendere l'oggetto eseguo:

Codice (Java): [Seleziona]
                Bundle b=getIntent().getExtras();
                OperationSetting op=b.getParcelable("1");

Il problema è che nonostante l'attività venga fatta partire senza problemi, ho un eccezione java.lang.outOfMemory; in particolare avviene un crash quando eseguo OperationSetting(Parcel in). Dove ho sbagliato?

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Passare un oggetto Parcelable contente un array di oggetti tra attività
« Risposta #1 il: 12 Settembre 2011, 11:04:17 CEST »
0
intanto prova a definire operation info in una classe a parte...
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline dharmadude

  • Nuovo arrivato
  • *
  • Post: 11
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows xp
Re:Passare un oggetto Parcelable contente un array di oggetti tra attività
« Risposta #2 il: 12 Settembre 2011, 11:21:40 CEST »
0
Ho sempre lo stesso errore...

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Passare un oggetto Parcelable contente un array di oggetti tra attività
« Risposta #3 il: 12 Settembre 2011, 11:25:55 CEST »
0
Non è propriamente la soluzione però io se fossi in te invece di perderci troppo tempo implementerei Serializable invece che Parcelable...

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Passare un oggetto Parcelable contente un array di oggetti tra attività
« Risposta #4 il: 12 Settembre 2011, 14:22:27 CEST »
0
ma quanti elementi passi? perchè outofmemory probabile sia perchè hai troppi elementi...
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline dharmadude

  • Nuovo arrivato
  • *
  • Post: 11
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows xp
Re:Passare un oggetto Parcelable contente un array di oggetti tra attività
« Risposta #5 il: 12 Settembre 2011, 14:51:52 CEST »
0
ma quanti elementi passi? perchè outofmemory probabile sia perchè hai troppi elementi...

Il vettore è formato da 15 oggetti

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Passare un oggetto Parcelable contente un array di oggetti tra attività
« Risposta #6 il: 12 Settembre 2011, 15:28:00 CEST »
0
2 cose:
1(domanda) perchè usi i bundle per scrivere e leggere invece che farlo direttamente per il parcel?
2-posta il logcat esatto
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline dharmadude

  • Nuovo arrivato
  • *
  • Post: 11
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows xp
Re:Passare un oggetto Parcelable contente un array di oggetti tra attività
« Risposta #7 il: 13 Settembre 2011, 22:27:30 CEST »
0
1 - Uso il Bundle in questo caso semplicemente come test, ma solitamente non lo uso
2 - Ecco il tomcat (Solo degli errori)

Codice: [Seleziona]
09-13 20:21:03.537: ERROR/Parcel(384): Class not found when unmarshalling:    p, e: java.lang.ClassNotFoundException:    p
09-13 20:21:04.077: ERROR/dalvikvm-heap(384): Out of memory on a 27525596-byte allocation.
09-13 20:21:06.589: ERROR/dalvikvm-heap(384): Out of memory on a 27525600-byte allocation.
09-13 20:21:07.248: ERROR/dalvikvm-heap(384): Out of memory on a 28836300-byte allocation.
09-13 20:21:14.599: ERROR/AndroidRuntime(384): FATAL EXCEPTION: main
09-13 20:21:14.599: ERROR/AndroidRuntime(384): java.lang.RuntimeException: Unable to start activity ComponentInfo{app.son/app.son.OperationListAct}: java.lang.ClassCastException: [Landroid.os.Parcelable;
09-13 20:21:14.599: ERROR/AndroidRuntime(384):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1622)
09-13 20:21:14.599: ERROR/AndroidRuntime(384):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1638)
09-13 20:21:14.599: ERROR/AndroidRuntime(384):     at android.app.ActivityThread.access$1500(ActivityThread.java:117)
09-13 20:21:14.599: ERROR/AndroidRuntime(384):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:928)
09-13 20:21:14.599: ERROR/AndroidRuntime(384):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:928)
09-13 20:21:14.599: ERROR/AndroidRuntime(384):     at android.os.Handler.dispatchMessage(Handler.java:99)
09-13 20:21:14.599: ERROR/AndroidRuntime(384):     at android.os.Looper.loop(Looper.java:123)
09-13 20:21:14.599: ERROR/AndroidRuntime(384):     at android.app.ActivityThread.main(ActivityThread.java:3647)
09-13 20:21:14.599: ERROR/AndroidRuntime(384):     at java.lang.reflect.Method.invokeNative(Native Method)
09-13 20:21:14.599: ERROR/AndroidRuntime(384):     at java.lang.reflect.Method.invoke(Method.java:507)
09-13 20:21:14.599: ERROR/AndroidRuntime(384):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
09-13 20:21:14.599: ERROR/AndroidRuntime(384):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
09-13 20:21:14.599: ERROR/AndroidRuntime(384):     at dalvik.system.NativeStart.main(Native Method)
09-13 20:21:14.599: ERROR/AndroidRuntime(384): Caused by: java.lang.ClassCastException: [Landroid.os.Parcelable;
09-13 20:21:14.599: ERROR/AndroidRuntime(384):     at operation.stat.manager.OperationSetting.<init>(OperationSetting.java:109)
09-13 20:21:14.599: ERROR/AndroidRuntime(384):     at operation.stat.manager.OperationSetting$1.createFromParcel(OperationSetting.java:115)
09-13 20:21:14.599: ERROR/AndroidRuntime(384):     at operation.stat.manager.OperationSetting$1.createFromParcel(OperationSetting.java:1)
09-13 20:21:14.599: ERROR/AndroidRuntime(384):     at android.os.Parcel.readParcelable(Parcel.java:1981)
09-13 20:21:14.599: ERROR/AndroidRuntime(384):     at android.os.Parcel.readValue(Parcel.java:1846)
09-13 20:21:14.599: ERROR/AndroidRuntime(384):     at android.os.Parcel.readMapInternal(Parcel.java:2083)
09-13 20:21:14.599: ERROR/AndroidRuntime(384):     at android.os.Bundle.unparcel(Bundle.java:208)
09-13 20:21:14.599: ERROR/AndroidRuntime(384):     at android.os.Bundle.getParcelable(Bundle.java:1100)
09-13 20:21:14.599: ERROR/AndroidRuntime(384):     at app.son.OperationListAct.onCreate(OperationListAct.java:38)
09-13 20:21:14.599: ERROR/AndroidRuntime(384):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
09-13 20:21:14.599: ERROR/AndroidRuntime(384):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1586)
09-13 20:21:14.599: ERROR/AndroidRuntime(384):     ... 11 more
« Ultima modifica: 13 Settembre 2011, 22:29:23 CEST da dharmadude »

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Passare un oggetto Parcelable contente un array di oggetti tra attività
« Risposta #8 il: 13 Settembre 2011, 23:51:29 CEST »
0
L'errore è un classifica cast exception,non out or memory!
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline dharmadude

  • Nuovo arrivato
  • *
  • Post: 11
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows xp
Re:Passare un oggetto Parcelable contente un array di oggetti tra attività
« Risposta #9 il: 14 Settembre 2011, 09:21:01 CEST »
0
Scusa, ma mi appare l'outofmemory dalla finestra watch quando effettuo il debug, non avevo considerato il tomcat  :-[