我从我的服务器得到一个像这样的对象数组:
Log.i(TAG, "Destinos obtenidos: "+ destinosRuta);
log的值 -
Destinos obtenidos [{"Latitud":41.40404,"nombreDestino":"Barcelona","IDR":5,"IDD":6,"Longitud":2.168679},{"Latitud":37.408424,"nombreDestino":"Sevilla","IDR":5,"IDD":7,"Longitud":-5.9681},{"Latitud":38.92298,"nombreDestino":"Mérida","IDR":5,"IDD":4,"Longitud":-6.363121}]
我想在SharedPreferences上存货,我使用了这个答案中的代码:
但我不知道我是否需要使用一个对象数组,或者我需要转换一个String数组,这是我的代码:
private Emitter.Listener onNuevaRuta = new Emitter.Listener() {
@Override
public void call(Object... args) {
runOnUiThread(new Runnable() {
@Override
public void run() {
JSONObject data = (JSONObject) args[0];
String destinosRuta = "";
try {
destinosRuta = data.getString("destinosRuta");
}catch (JSONException e) {
return;
}
//destinosRuta has the previous value
ArrayList<String> listaDestinos = new ArrayList<String>(Arrays.asList(destinosRuta));
setStringArrayPref(getApplicationContext(), "listaDestinos", listaDestinos);
listaDestinos = getStringArrayPref(getApplicationContext(), "listaDestinos");
String origen = listaDestinos.remove(0);
String destino = listaDestinos.remove(0);
setStringArrayPref(getApplicationContext(), "listaDestinos", listaDestinos);
...
而且,和上一个链接一样,我使用了他的功能:
public static void setStringArrayPref(Context context, String key, ArrayList<String> values) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
SharedPreferences.Editor editor = prefs.edit();
JSONArray a = new JSONArray();
for (int i = 0; i < values.size(); i++) {
a.put(values.get(i));
}
if (!values.isEmpty()) {
editor.putString(key, a.toString());
} else {
editor.putString(key, null);
}
editor.commit();
}
public static ArrayList<String> getStringArrayPref(Context context, String key) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
String json = prefs.getString(key, null);
ArrayList<String> destinos = new ArrayList<String>();
if (json != null) {
try {
JSONArray a = new JSONArray(json);
for (int i = 0; i < a.length(); i++) {
String destino = a.optString(i);
destinos.add(destino);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
return destinos;
}
当我在这里删除listaDestinos的第一个元素时出现错误:
String origen = listaDestinos.remove(0);
String destino = listaDestinos.remove(0); &LT; - 错误
致命的例外:主要 过程:tfg.clienteandroid,PID:17276 java.lang.IndexOutOfBoundsException:索引0无效,大小为0 在 java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255) at java.util.ArrayList.remove(ArrayList.java:403) at tfg.clienteandroid.mapaActivity $ 3 $ 1.run(mapaActivity.java:320)
有什么想法吗?我想删除两次,并能够使用我的数组中的两个对象。
答案 0 :(得分:3)
您不需要存储列表对象。如果您的服务器已经返回JSON,您可以直接存储它。
JSONObject data = (JSONObject) args[0];
String response = String.valueOf(data);
//... Or parse out the data you need
sharedPrefs.putString("response", response);
将字符串转换为JSON对象或其他任何东西,并可选择将其解析为实际的Java对象(您可以使用Jackson或Gson来帮助您)
无论如何,不确定为什么你认为你需要从列表中删除一个对象才能提取一个值;此外,看起来您只在列表中添加了一个值,而不是两个。 Arrays.asList()
方法会为您创建一个字符串列表。您无法从该列表中删除两个对象
因此,尝试使用一些断点和更多日志语句更好地调试代码。
换句话说,您似乎在解析数据时遇到问题,而不仅仅是使用SharedPreferences
例如,
data.getString("destinosRuta");
这实际上是一个字符串吗?还是阵列?如果是数组,请使用JSONObject类的相应方法来获取数组。
答案 1 :(得分:2)
将您的json保存为喜欢这样的
SharedPreferences appSharedPrefs = PreferenceManager.getDefaultSharedPreferences(this.getApplicationContext());
Editor prefsEditor = appSharedPrefs.edit();
prefsEditor.putString("MyObject", destinosRuta);
prefsEditor.commit();
获取它何时使用并转换为ArrayList或List,如下所示
SharedPreferences appSharedPrefs = PreferenceManager.getDefaultSharedPreferences(this.getApplicationContext());
Gson gson = new Gson();
String json = appSharedPrefs.getString("MyObject", "");
Type type = new TypeToken<List<Object>>(){}.getType();
List<Object> objects= gson.fromJson(json, type);