从Socket.IO

时间:2017-08-25 02:58:06

标签: java android json arraylist indexoutofboundsexception

我从我的服务器得到一个像这样的对象数组:

 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上存货,我使用了这个答案中的代码:

putStringSet and getStringSet

但我不知道我是否需要使用一个对象数组,或者我需要转换一个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)

有什么想法吗?我想删除两次,并能够使用我的数组中的两个对象。

2 个答案:

答案 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);