我正在尝试将一个对象传递给一个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();
}
}
答案 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;
}
}
以这种方式添加
Person.addPerson("Fred", getResources().getDrawable(R.drawable.fred207),"sick", Color.rgb(89,168,65)) ;
传递位置而不是Person
PersonDescriptionPage.putExtra("position", position);
检索您的商品
Person.getPerson(position);
答案 1 :(得分:0)
将transient关键字添加到图像声明中。 我认为Gson在查找Drawable使用的所有对象的类成员时遇到了一些问题。具体来说,我认为Rect是罪魁祸首?
无论如何,transient使得该字段不包含在Gson的序列化/反序列化中。 (它跳过那个成员)