Autore Topic: serializzare e deserializzare correttamente  (Letto 330 volte)

Offline broke31

  • Nuovo arrivato
  • *
  • Post: 24
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    galaxy s6
  • Sistema operativo:
    windows
serializzare e deserializzare correttamente
« il: 13 Luglio 2016, 21:38:44 CEST »
0
salve raga, sono giorni che provo a serializzare e deserializzare correttamente un ArrayList senza riuscirci, mi spiego meglio:
ho bisogno che all'apertura della app, venga letto da un file(che se non esiste deve essere creato) il contenuto di un arrayList, e alla chiusura dell'app, l'arrayList deve essere scritto all'interno di nuovo nel file.
il codice è il seguente:

Codice (Java): [Seleziona]
/*metodo di ripristino deill'arrayList*/
public   void restoreArrayList(Context context) throws ClassNotFoundException, IOException {
        File fp= new File(filename);
        if (!fp.exists())
            fp.createNewFile();
        FileInputStream fis = context.openFileInput (filename);
        ObjectInputStream ois = new ObjectInputStream ( fis );
        productArrayList = ( ArrayList<Buildable> ) ois.readObject ();
        ois.close ();
    }

/*metodo di salvataggio */
public   void saveArrayListProduct(Context context) throws IOException {
        try {
            FileOutputStream fos = context.openFileOutput ( fN, Context.MODE_PRIVATE );
            ObjectOutputStream os = new ObjectOutputStream ( fos );
            os.writeObject ( productArrayList );
            fos.close ();
            os.close ();
        } catch ( Exception ex ) {
            ex.printStackTrace ();
        }

    }
il problema che quando  per la prima volta si avvia l'app (chiaramente mi da un filenotfound(viene chiamato il metodo restoreArrayList) ), ma non so come rimediare.. grazie mille
p.s. Non so bene come gestire la chiamata del metodo saveArrayList, so che quando l'activity viene distrutta viene invocato il metodo onDestroy, ma esiste un onDestroy della app?
« Ultima modifica: 13 Luglio 2016, 21:45:49 CEST da broke31 »

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 582
  • Respect: +130
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:serializzare e deserializzare correttamente
« Risposta #1 il: 14 Luglio 2016, 10:20:54 CEST »
0

Per gestire il primo avvio:

Codice (Java): [Seleziona]
public   void restoreArrayList(Context context) throws ClassNotFoundException, IOException {

        File fp= new File(filename);
        if (fp.exists()) {
            //fp.createNewFile();
          FileInputStream fis = context.openFileInput (filename);
          ObjectInputStream ois = new ObjectInputStream ( fis );
          productArrayList = ( ArrayList<Buildable> ) ois.readObject ();
          ois.close ();
        } else {
          //Il file non esiste
          //Istanzio array vuoto
          productArrayList = new ArrayList<Buildable>();
        }
    }

Per il salvataggio dei dati, l'evento consigliato è onPause().

Per evitare salvataggi inutili, ti consiglierei di mantenere un booleano che indica se sono state effettuate delle modifiche, in modo da salvare i dati solo se necessario (evita usura della memoria).

Codice (Java): [Seleziona]
boolean datiModificati = false; //Devi settarlo a "true" se modifichi l'arraylist

@Override
protected void onPause() {
  if (datiModificati) {
    saveArrayListProduct(this);
  }
  super.onPause();
}
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline broke31

  • Nuovo arrivato
  • *
  • Post: 24
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    galaxy s6
  • Sistema operativo:
    windows
Re:serializzare e deserializzare correttamente
« Risposta #2 il: 14 Luglio 2016, 19:16:30 CEST »
0
perdonami, ma nell'onpause di quale activity deve essere inserito il metodo? perché ho inserito onPause nella acivivity "principale"(ovvero quella che ti permette di effettuare le scelte) ma nulla, quando killo l'app dal background(stando nella activity dove ho dichiatato il metodo onPause) non viene invocato l'onPause  non so come posso fare.. grazie:-)

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 582
  • Respect: +130
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:serializzare e deserializzare correttamente
« Risposta #3 il: 14 Luglio 2016, 23:11:43 CEST »
0

La onPause, da specifiche, viene comunque invocata prima che l'activity sia killata.

Citazione
(...) you should use the onPause() method to write any persistent data (such as user edits) to storage.

Citazione
Note that it is important to save persistent data in onPause() instead of onSaveInstanceState(Bundle) because the latter is not part of the lifecycle callbacks, so will not be called in every situation as described in its documentation

Fonte: https://developer.android.com/reference/android/app/Activity.html
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline broke31

  • Nuovo arrivato
  • *
  • Post: 24
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    galaxy s6
  • Sistema operativo:
    windows
Re:serializzare e deserializzare correttamente
« Risposta #4 il: 15 Luglio 2016, 01:38:51 CEST »
0
ho seguito i tuoi consigli, ma nulla.. ogni volta che faccio l'if file.exits ritorna sempre false,(quando killo l'app) non so proprio cosa sto sbagliando.

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 582
  • Respect: +130
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:serializzare e deserializzare correttamente
« Risposta #5 il: 15 Luglio 2016, 10:40:33 CEST »
0

Cosa intendi dire "volta che faccio l'if file.exits"?
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline broke31

  • Nuovo arrivato
  • *
  • Post: 24
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    galaxy s6
  • Sistema operativo:
    windows
Re:serializzare e deserializzare correttamente
« Risposta #6 il: 15 Luglio 2016, 18:57:28 CEST »
0
se gurdi nel codice, nel metodo di restore c'è if (!fp.exists()).
Questo metodo viene invocato ogni volta che l'app si apre, quindi il comportamento da me aspettato è: all'apertura della prima volta in assoluto della mia app, questo il risulti vero(quindi il file non esiste) e quindi viene generato il file e viene creato un arrayList( vuoto), le successive aperture della mia app devono darmi false in questo if(perché il file esiste) e quindi andare a prendere il contenuto del mio arrayList(salvato nel file) e andarle a mettere all'interno del mio arrayList(quello che uso nella app).
Analizzando il codice col debugger ho notato che questo if mi dice sempre true(il file non esiste).
P.s prima ho sbagliato,  nel post precedente volevo dire l'if è vero(ovvero il file non esiste) mentre ti ho scritto che restituisce false(ho invertito i valori di ritorno sorry):-)

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 582
  • Respect: +130
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:serializzare e deserializzare correttamente
« Risposta #7 il: 15 Luglio 2016, 19:04:05 CEST »
0
Verifica da debug se il file viene effettivamente scritto nel metodo onPause.

Magari è un errore di salvataggio.

P.S.: E' inutile creare un file vuoto, ti suggerisco di saltare il tentativo di caricamento se il file non c'è.
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.