【问题标题】:Gson freezing programGson冷冻程序
【发布时间】:2015-04-27 21:50:51
【问题描述】:

我试图将一个对象传递给一个意图,我在这里阅读了一篇不同的帖子来使用 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();
    }
}

【问题讨论】:

  • 你的 json 对象有多大?
  • 不是很大,每个都是list.add(new Person("Fred", getResources().getDrawable(R.drawable.fred207),"sick", Color.rgb(89,168,65) ))) ;
  • PersonDescriptionPage 到底是什么?
  • 这是一个 android 活动,包含两个 textView,一个 ImageView 和一个 Switch,但代码永远不会到达它。
  • 刚刚修复了它,就我而言,问题是因为我有一个Context 对象。将其标记为transient 解决了这个问题。您可能应该将image 标记为@Android777 建议的瞬态

标签: java android gson


【解决方案1】:

最好使用单例来执行此操作。我认为它完全冻结在图像上(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. 传递位置而不是人员

    PersonDescriptionPage.putExtra("position", position);
    
  3. 取回您的物品

    Person.getPerson(position);
    

【讨论】:

  • 是图像搞砸了。我通过将其设为位图字节 [] 来解决它。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2016-04-05
    • 2016-04-10
    • 2016-03-14
    • 1970-01-01
    • 1970-01-01
    • 2020-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多