2012-09-06 1 views
5

Sto scrivendo un app Android, che è in grado di esportare lo stato attuale di un Activity o Fragment ad un JSON-file, che ha il seguente formato comune:Android/Java comune JSON interfaccia importazione

{ 
    "data": { 
    "result": { 
     <content depends on specific class> 
    }, 
    "input": { 
     <content depends on specific class> 
    } 
    }, 
    "identifier": <identifier depends on specific class>, 
    "version": 1 
} 

Ciò significa che Activities/Fragments che hanno la possibilità di esportare compilare i contenuti contrassegnati implementando un'interfaccia che ho chiamato "Esportabile" e la funzione di esportazione globale chiama i metodi definiti nell'interfaccia. Questa è una soluzione diretta che funziona abbastanza bene.

Fin qui tutto bene. Ora voglio fare la direzione inversa. Voglio caricare un file e chiamare il corrispondente Activity/Fragment dipendente dal contenuto dell'identificatore.

La lettura del contenuto dell '"input" e del "risultato" deve essere effettuata con un metodo dello stesso Activity/Fragment.

Purtroppo questo non è ovvio per me come risolvere questo problema in modo elegante. Qual è il modo migliore per farlo? La soluzione deve essere il più astratta possibile in modo che possa essere facilmente estesa.

+0

Che cosa accade usando ['SharedPreferences'] (http://developer.android.com/guide/topics/data/data-storage.html#pref) per salvare e ripristinare lo stato' Activity'? Questo sopravvive anche al riavvio dell'applicazione/dispositivo. Se si desidera mantenere uno stato di breve durata (rotazione del dispositivo, sfondo), è possibile utilizzare il sistema integrato ['SavedInstanceState'' Bundle'] (http://developer.android.com/training/basics/activity- ciclo di vita/recreating.html). –

risposta

0

Ci potrebbero essere così tante risposte diverse a questo. Google ha una libreria chiamata GSON, che può leggere e scrivere automaticamente i dati JSON da e verso le classi Java. Se non si desidera utilizzare una libreria, è possibile utilizzare la riflessione Java.

0

JSONObject js = new JSONObject ("data");

JSONObject jSObject1 = js.getJSONObject ("risultato"); JSONObject jSObject2 = js.getJSONObject ("input"); e così via Spero di capire il problema

0

Un if-else sarebbe la soluzione più semplice, ma se non è abbastanza astratto per voi, utilizzare il Abstract Factory pattern.

Creare un'interfaccia ExportableFactory che definisce un metodo per creare un Exportable e le implementazioni di questa interfaccia per Activity e Fragment. Quindi creare uno Map<String, ExportableFactory> che associa i possibili valori di identifier alla fabbrica corretta. Quindi chiamare:

Exportable exportable = factoryMap.get(identifier).createExportable(data); 

questo modo, se si desidera aggiungere una terza implementazione di Exportable, sarà sufficiente per creare la corrispondente realizzazione di ExportableFactory e aggiungerlo alla mappa, senza modificare la funzione chiamante.