Gson冻结计划

时间:2015-04-27 21:50:52

标签: java android gson

我正在尝试将一个对象传递给一个intent,我在这里读了一个不同的帖子来使用Gson。现在它没有显示任何错误并且运行。但当我点击一个按钮时,它就冻结了我的手机。没有异常抛出。

OnCreate {
...
listViewObjects.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                Person item = (Person)parent.getItemAtPosition(position);
                Toast.makeText(getApplicationContext(), item.name + " selected\n" + item.status, Toast.LENGTH_SHORT).show();

                Gson gson = new Gson();
                String json = gson.toJson(item);
                PersonDescriptionPage.putExtra("person", json);
                startActivity(PersonDescriptionPage);
            }
        });
}

我最初将它作为带有匿名Gson对象的一行

PersonDescriptionPage.putExtra("person", new Gson().toJson(item));

如果我调试它冻结在这一行。所以我然后将它拆分为一个实例化的对象,你在上面的第一个代码块中看到它并冻结gson.toJson(item)

作为参考,我试图序列化为Json的类是:

public class Person{

    String name;
    boolean ownIt;
    Drawable image;
    String status;
    int backgroundColor;

    public Person(){}

    public Person(String n, Drawable d, String s, int b)
    {
        this.name= n;
        this.ownIt = false;
        this.image = d;
        this.status = s;
        this.backgroundColor = b;
    }

    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return this.name.toString();
    }
}

2 个答案:

答案 0 :(得分:0)

最好使用Singleton来做到这一点。我认为它完全冻结在图像上(getResources()。getDrawable(R.drawable.fred207))。
我建议这个

  public class Person{

        //singleton
        private static ArrayList<Person> persons=null;

        String name;
        boolean ownIt;
        Drawable image;
        String status;
        int backgroundColor;

        //only getPerson creates objects
        private Person(){}

        private Person(String n, Drawable d, String s, int b)
        {
            this.name= n;
            this.ownIt = false;
            this.image = d;
            this.status = s;
            this.backgroundColor = b;
        }

        @Override
        public String toString() 
        {
            // TODO Auto-generated method stub
            return this.name.toString();
        }


        public static Person addPerson()
        {
            if(persons==null)
            {
                persons = new ArrayList<Person>();

            }
            Person pers = new Person();
            persons.add(pers);
            return pers;
        }

        public static Person addPerson(String n, Drawable d, String s, int b)
        {
            if(persons==null)
            {
                persons = new ArrayList<Person>();

            }
            Person pers = new Person(n,d,s,b);
            persons.add(pers);
            return pers;
        }

        public static Person getPerson(int index)
        {
            if(persons==null)
                return null;
            if(index>(persons.size()-1))
                return null;
            return persons.get(index);
        }

        public static ArrayList<Person> getPersons()
        {
            return persons;
        }

    }
  1. 以这种方式添加

    Person.addPerson("Fred", getResources().getDrawable(R.drawable.fred207),"sick", Color.rgb(89,168,65)) ;
    
  2. 传递位置而不是Person

    PersonDescriptionPage.putExtra("position", position);
    
  3. 检索您的商品

    Person.getPerson(position);
    

答案 1 :(得分:0)

将transient关键字添加到图像声明中。 我认为Gson在查找Drawable使用的所有对象的类成员时遇到了一些问题。具体来说,我认为Rect是罪魁祸首?

无论如何,transient使得该字段不包含在Gson的序列化/反序列化中。 (它跳过那个成员)