Domanda

Ci chiedevamo se quando si utilizza Bundle con oggetti serializzabili o Parcelable, quando fa lo smistamento effettivamente accadere? Non appena lo metti nel bundle? Dal momento che fasci sono per lo più utilizzati per semplicemente passare intorno dati tra due schermi (non stiamo nemmeno parlando di IPC qui!), Non sembra essere molto senso di smistamento di un oggetto, in quanto rimane in memoria per tutto il tempo, non ?

Abbiamo ragione nel ritenere che di smistamento (che si tratti di Java serializzazione o Android parcellizzazione) avviene solo se

  1. i dati deve essere passato a un altro processo, ad esempio durante il RMI, o
  2. il componente (attività o servizio) viene distrutta e lo stato istanza deve essere scritto su disco?

Ho visto Android ingegneri quadro (credo fosse Dianne Hackborn) dicono che si dovrebbe usare Parcelable invece di Serializable perché il primo è molto più veloce. Quanto più veloce? E sarà questo anche fare la differenza, se l'oggetto non viene marshalling la maggior parte del tempo in ogni caso (assumendo le nostre ipotesi su questo aveva ragione)?

È stato utile?

Soluzione

credo di aver capito. Ho praticamente passato tutto ultimo giorno e la maggior parte di oggi sul debug attraverso il codice sorgente di Parcel e Bundle Android, ed ecco come funziona:

  • Un bundle è fondamentalmente solo un wrapper per un HashMap, ma supporta a pacco (cioè maresciallo), che mappa interna e il suo contenuto
  • se si mette un valore in un fascio, in primo luogo unparcel questa mappa interna, e poi semplicemente inserire il valore in quella mappa
  • unparceling mappa accade pigramente: sarà solo unparcel se si sta cercando di accedervi (ad esempio chiamando bundle.putParcelable ()). Anche allora, sarà unparcel solo la mappa in sé, ma non i suoi valori. Solo quando si tenta di accedere in realtà questi valori (ad esempio utilizzando bundle.getParcelable ( "chiave")) sarà unparcel il valore, anche. In altre parole, se si Parcel qualcosa che è all'interno di un bundle, unparcelling non si verificherà se non si accede nuovamente questi valori.

Quindi in generale: No , un valore non è, non parcellizzata semplicemente mettendolo in un bundle. Invece, lottizzazione accade quando si passa la Bundle ad un altro componente (attività o servizio;. Perché Android lo fa, non lo so, dal momento che nessun IPC sta accadendo tecnicamente). O quando deve altrimenti essere parcellizzato

Altri suggerimenti

Credo che accada subito. E penso che l'incremento di prestazioni è a causa di serializable riflessione necessaria per lavorare. Penso che sia la stessa della differenza di prestazioni tra serializzabile e Externalizable.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top