Comment mettre en Cache les données Json être disponible hors connexion?
J'ai analysé les Données JSON dans un listview
et maintenant je veux le rendre disponible hors connexion.
Est-il un moyen pour enregistrer les données JSON sur le téléphone de sorte que vous pouvez voir les données si votre téléphone est en mode hors connexion?
Quelqu'un sait-elle un exemple?
MODIFIER fonctionne maintenant:
public class MainActivity extends ListActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
new TheTask().execute();
}
class TheTask extends AsyncTask<Void, Void, JSONArray> {
InputStream is = null;
String result = "";
JSONArray jArray = null;
ProgressDialog pd;
@Override
protected void onPostExecute(JSONArray result) {
super.onPostExecute(result);
pd.dismiss();
ArrayList<String> list= new ArrayList<String>();
try {
for(int i=0;i<result.length();i++) {
JSONObject jb = result.getJSONObject(i) ;
String name = jb.getString("name")+" "+jb.getString("Art");
list.add(name);
}
} catch(Exception e) {
e.printStackTrace();
}
setListAdapter(new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, list));
}
@Override
protected void onPreExecute() {
super.onPreExecute();
pd = ProgressDialog.show(MainActivity.this, "State",
"Loading...", true);
}
@Override
protected JSONArray doInBackground(Void... arg0) {
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
try {
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("***");
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
is = entity.getContent();
} catch (Exception e) {
Log.e("log_tag", "Error in http connection " + e.toString());
}
//Convert response to string
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(
is, "iso-8859-1"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
is.close();
result = sb.toString();
writeToFile(result);
} catch (Exception e) {
Log.e("log_tag", "Error converting result " + e.toString());
}
try {
jArray = new JSONArray(result);
} catch (JSONException e) {
Log.e("log_tag", "Error parsing data " + e.toString());
}
try {
jArray = new JSONArray(readFromFile());
} catch (JSONException e) {
Log.e("log_tag", "Error parsing data " + e.toString());
}
return jArray;
}
}
private void writeToFile(String data) {
try {
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(openFileOutput("config.txt", Context.MODE_PRIVATE));
outputStreamWriter.write(data);
outputStreamWriter.close();
}
catch (IOException e) {
Log.e("Exception", "File write failed: " + e.toString());
}
}
private String readFromFile() {
String ret = "";
try {
InputStream inputStream = openFileInput("config.txt");
if ( inputStream != null ) {
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String receiveString = "";
StringBuilder stringBuilder = new StringBuilder();
while ( (receiveString = bufferedReader.readLine()) != null ) {
stringBuilder.append(receiveString);
}
inputStream.close();
ret = stringBuilder.toString();
}
} catch (FileNotFoundException e) {
Log.e("login activity", "File not found: " + e.toString());
} catch (IOException e) {
Log.e("login activity", "Can not read file: " + e.toString());
}
return ret;
}
}
- Vous pouvez l'enregistrer sur le téléphone de base de données. Recherche pour elle.
Vous devez vous connecter pour publier un commentaire.
Vous avez deux façons. Soit vous créez une base de données et enregistrer toutes les données et de les récupérer en arrière quand vous le souhaitez. Ou si les données que vous avez n'est pas tant que ça et vous ne voulez pas avoir affaire avec des bases de données, puis vous écrivez la chaîne json vers un fichier texte dans la carte mémoire et de les lire plus tard, lorsque vous êtes en mode hors connexion.
Et pour le second cas, chaque fois que vous allez en ligne, vous pouvez récupérer la même json de votre service web et l'écriture à l'ancienne. De cette façon, vous pouvez être sûr que vous avez la dernière json enregistré à l'appareil.
SharedPreferences
.cette classe va vous aider à cache chaînes de caractères dans des fichiers avec une clé pour le récupérer plus tard. la chaîne peut être une chaîne json et la clé peut être l'url que vous avez demandé et également un identifiant pour l'url si vous utilisez la méthode post.
comment l'utiliser :
Une fois que vous télécharger les données que vous pourrait persister les données sur le mobile, à l'aide d'une base de données ou un système de votre choix.
Vous pouvez vérifier les différentes options ici: de stockage de données
à l'aide de SharedPreferences doivent être prêts à sqlite (sauf bien sûr si vous avez une structure de base de données). Pour la mise en cache et le stockage de données tirée de l'internet, je vous recommande de robospice: https://github.com/octo-online/robospice. C'est très bien fait, bibliothèque, facile à utiliser, et doit être utilisé chaque fois que vous télécharger des données à partir d'internet ou d'avoir un travail de longue haleine.
Vous pouvez utiliser ces deux méthodes, deux magasin, vous
JSON
fichier comme une chaîne de caractères dans votreSharedPreferences
et de les récupérer en arrière:Suffit d'utiliser
setStringProperty("json", "yourJsonString")
pour enregistrer etgetStringProperty("json")
à récupérer.Vous pouvez utiliser gson pour analyser les données JSON en plus facilement.
Dans votre construction.gradle fichier ajouter cette dépendance.
Ensuite créer une classe POJO pour analyser les données JSON.
Exemple de classe POJO:
D'analyser une chaîne json à partir d'internet l'utilisation de cet extrait
Puis ajouter une classe d'assistance pour stocker et récupérer des données JSON et de préférences.
Exemple: classe d'assistance pour stocker des données
Pour enregistrer des données
Pour récupérer des données
Vous pouvez mettre en cache votre Rénovation des réponses, de sorte que lorsque vous faites la même demande une seconde fois, Rénovation va le prendre dans son cache:
https://medium.com/@coreflodev/understand-offline-first-and-offline-last-in-android-71191e92b426, https://futurestud.io/tutorials/retrofit-2-activate-response-caching-etag-last-modified. Après que vous l besoin d'analyser que json nouveau