解析相同JSON的不同结果

时间:2014-05-30 04:03:47

标签: java android json listview android-asynctask

我很难搞清楚造成问题的原因。

所以,我试图从JSON中获取两组字符串并在列表视图中显示它们。当我第一次测试应用程序时,它很棒。一切都按预期工作。

但当我关闭并重新打开它时,我的列表视图只显示一组字符串(只有第二组,重复两次)。

这是处理解析JSON的类:(它在AsyncTask中执行)

    public class ListarPosts extends SherlockActivity{

    String URL = null, Titulo = null;

    ArrayList<Post> posts = new ArrayList<Post>();

    public ArrayList<Post> getPosts(String Json){
        try {
            JSONObject jObject = new JSONObject(Json);

            JSONArray jArray = jObject.getJSONArray("Posts");

            for (int i = 0; i < jArray.length(); i++) {
                final int id = jArray.getJSONObject(i).getInt("ID");
                final int tipo = verificaTipo(jArray.getJSONObject(i).getString("Tipo"));
                final JSONArray jValues = jArray.getJSONObject(i).getJSONArray("Valores");

                for (int a = 0; a < jValues.length(); a++) {
                    final String KEY = jValues.getJSONObject(a).getString("Key");
                    System.out.println(KEY);
                    final String Value = jValues.getJSONObject(a).getString("Value");
                    System.out.println(Value);

                    if (KEY.equals("URL"))
                        URL = Value;
                    else if (KEY.equals("TITULO"))
                        Titulo = Value;
                }

                ListarPosts.this.runOnUiThread(new Runnable() {

                    @Override
                    public void run() {
                        // TODO Auto-generated method stub
                        posts.add(new Post(id, Titulo, tipo));
                    }

                });
            }
            return posts;
        } catch (ParseException e) {
            e.printStackTrace();
            return null;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

当我打印键和值时,即使列表视图错误,它也会显示正确的字符串。

我的猜测是,当我创建新的“Post”并将其添加到ArrayList时出现问题。这可以解释为什么它打印正确的,但在ListView之后不会显示它。也许有些冲突因为我在AsyncTask中创建了一个新实例?

无论如何,我有点失落。如果您对我应该尝试或可能出现的问题有所了解,请告诉我。

感谢您提供任何帮助!

2 个答案:

答案 0 :(得分:0)

每次Arraylist添加到新数据之前都要清除.... 并删除Asynctask.thats中的runonuithread,这里不需要..

public ArrayList<Post> getPosts(String Json){
        try {
            JSONObject jObject = new JSONObject(Json);

            JSONArray jArray = jObject.getJSONArray("Posts");


                  if(posts.size()>0){
                  posts.clear();
             }

            for (int i = 0; i < jArray.length(); i++) {
                final int id = jArray.getJSONObject(i).getInt("ID");
                final int tipo = verificaTipo(jArray.getJSONObject(i).getString("Tipo"));
                final JSONArray jValues = jArray.getJSONObject(i).getJSONArray("Valores");


                for (int a = 0; a < jValues.length(); a++) {
                    final String KEY = jValues.getJSONObject(a).getString("Key");
                    System.out.println(KEY);
                    final String Value = jValues.getJSONObject(a).getString("Value");
                    System.out.println(Value);

                    if (KEY.equals("URL"))
                        URL = Value;
                    else if (KEY.equals("TITULO"))
                        Titulo = Value;
                }


                 posts.add(new Post(id, Titulo, tipo));
             }
            return posts;
        } catch (ParseException e) {
            e.printStackTrace();
            return null;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }

多数民众赞成......

答案 1 :(得分:0)

问题出在runOnUiThread()中。 Tipo的值在我认为的线程中更新。

  public class ListarPosts extends Activity {

        ArrayList<String> URL = null, Titulo = null;

        ArrayList<Post> posts = new ArrayList<Post>();
        int id;
        int tipo;

        public ArrayList<Post> getPosts(String Json) {

            try {
                posts = new ArrayList<Post>();
                URL = new ArrayList<String>();
                Titulo = new ArrayList<String>();
                JSONObject jObject = new JSONObject(Json);

                JSONArray jArray = jObject.getJSONArray("Posts");

                for (int i = 0; i < jArray.length(); i++) {
                    id = jArray.getJSONObject(i).getInt("ID");
                    tipo = 1;
                    final JSONArray jValues = jArray.getJSONObject(i).getJSONArray(
                            "Valores");

                    for (int a = 0; a < jValues.length(); a++) {
                        final String KEY = jValues.getJSONObject(a)
                                .getString("Key");
                        System.out.println(KEY);
                        final String Value = jValues.getJSONObject(a).getString(
                                "Value");
                        System.out.println(Value);

                        if (KEY.equals("URL"))
                            URL.add(Value);
                        else if (KEY.equals("TITULO"))
                            Titulo.add(Value);
                    }

                }
                for (String value : Titulo) {
                        // If you need to use runOnUiThread, you can implement here
                    posts.add(new Post(id, value, tipo));
                }
                return posts;
            } catch (ParseException e) {
                e.printStackTrace();
                return null;
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
          }
      }