在活动之间传递参数 - 空值

4

我正在发送一个实现了Serializable接口的自定义类的对象:

public class MyObject extends ParseObject implements Serializable {
private static final long serialVersionUID = 1L;
public MyObject() {
}
public String getTitle() {
    return getString("title");
}
public void setTitle(String title) {
    put("title", title);
}
public ParseFile getParseFile() {
    return getParseFile("file");
}
public void setParseFile(ParseFile file) {
    put("file", file);
}
}

这个类包含一个字符串和一个ParseFile。

我正在尝试将一个对象从一个Activity传递到另一个Activity。

private void editMyObject(MyObject myObject) {
    Intent intent = new Intent(AActivity.this, BActivity.class);
    intent.putExtra("MyObject", myObject);  
    Toast.makeText(getApplicationContext(), "OUT: "+myObject.getTitle(), Toast.LENGTH_SHORT).show(); // here i get the content, proper string
    startActivity(intent);
}

在“接收器(receiver)”活动中:

protected void onCreate(Bundle savedInstanceState) {
    ...

    Intent intent = getIntent();
    myObject = (MyObject)intent.getSerializableExtra("MyObject");
    if (myObject != null) {
        editText.setText(myObject.getTitle());
    }
    Toast.makeText(getApplicationContext(), "IN: "+myObject.getTitle(), Toast.LENGTH_SHORT).show(); // here is null
}

我做错了什么..?我遵循了SO上其他问题的建议,但并没有帮助;) 顺便说一句:不,ParseFile是Parse开发者的类。


要传递用户定义的对象,您需要实现可解析(Parsebel)接口而不是可序列化(Serializable)。 - Biraj Zalavadia
@BirajZalavadia Parsebel?这是打错了吗(你想表达的是Parcelable吗?)还是我找不到这个东西? - Nat
请发布MyObject和ParseObject的代码。 - Ritesh Gune
我已更新问题。请注意,ParseObject是一个库(我已在问题末尾附上链接),而不是我的对象。 - Nat
5个回答

1
我猜应该是这样的ParsObject实现Serializable接口,因为根据Serializable主题,如果父类不是可序列化的,则实例的状态无法维护。所以尝试使ParseObject类可序列化并查看结果。
尝试像这样做。
public class MyObject implements Serializable {

private ParseObject parseObject;

public MyObject() {
    parseObject = new ParseObject();
}

public String getTitle() {
    return parseObject.getString("title");
}

public void setTitle(String title) {
    parseObject.put("title", title);
}

public ParseFile getParseFile() {
    return parseObject.getParseFile("file");
}

public void setParseFile(ParseFile file) {
    parseObject.put("file", file);
}

private void writeObject(java.io.ObjectOutputStream stream)
        throws IOException {
    stream.writeObject(parseObject);
}

private void readObject(java.io.ObjectInputStream stream)
        throws IOException, ClassNotFoundException {
    parseObject = (ParseObject) stream.readObject();
}
}

我已经用Toast编写了代码行 - 在发送之前,myObject.getText()具有正确的数据,因此它不可能为空。 - Nat
你能分享一下你的 Pojo 类吗? - Sonusingh Chauhan
请粘贴您的日志记录细节。 - Sonusingh Chauhan
ParseFile是一个外部库,我无法访问。如果它不是可序列化的,我就无法使它可序列化。我没有访问该类的权限。我一定需要使用ParseFile。 - Nat
1
好主意。我不能这样实现它,因为有一些Parse内部问题,但是我已经与一些人聊过了,结果发现Parse无论如何都会缓存所有对象,所以最好的想法是再次“下载”它。不管怎样,我将接受这个答案,因为你教给了我一些非常有趣的东西。 - Nat
@SonusinghChauhan:你是个酷哥 :) - Terril Thomas

1
您可以使用 bundle 来传递数据。
Bundle bundle = new Bundle();  
bundle.putSerializable("MyObject", myObject);
intent.putExtras(bundle);

使用以下代码检索

Intent intent = getIntent();
Bundle bundle = intent.getExtras();
myObject = (MyObject)bundle.getSerializable("MyObject");

在接收器类中,结果相同,也会在toast中为null。 - Nat
这并没有解决 OP 的问题,但我发现将一个 byte[] 传递过去,在新的活动中创建一个 parseFile 是有用的。 - Johnny

0
这是我的代码,用于在Activity之间传递Object类:
public class ClassName extends Activity{

  static ClassName2 abc_obj;

  public ClassName(ClassName2 a_b_c){
    abc_obj = a_b_c;
  }

  @Override
  public void onCreate(Bundle savedInstanceState) {
    // here you can access everything of class ClassName2
  }
}

//这里是将Abc类传递给ClassName类的代码:

ClassName2 objAbc = new ClassName2(); //update ClassName2 according to you

ClassName x_y_z = new ClassName(objAbc);
Intent intent = new Intent(this, x_y_z.getClass());
startActivity(intent);

希望它能帮到你。编码愉快 :)

嗯,这不会非常占用内存吗?没有任何东西可以被释放,ClassName2一直在内存中。 - Nat
当你完成 ClassName2 后,你必须从内存中清除它,这并不是很复杂。希望那些从事移动编程的人都非常了解 :) 谢谢 - enam

0
public class MyObject extends ParseObject implements Serializable {

如果ParseObject是你的类?如果是,请尝试将其设置为serializable。 还要检查一些Android对象是否不可serializable,以忽略这些对象,请使用transient

还要使用intent.putSerializable("MyObject", myObject);intent.gettSerializable("MyObject");


不,Parse对象是来自Parse开发者的类。 - Nat
检查编辑后的答案,如果您粘贴整个MyObject,则会很好。 - Siddhesh
就像我说的那样,您需要检查类中的对象是否可序列化。也许您的parsefile不可序列化。 - Siddhesh

0

我认为你的MyObject并不是真正可序列化的。要序列化一个类,需要满足两个条件:

  • 实现Serializable接口
  • 所有成员必须是可序列化的

我怀疑ParseFile不可序列化,所以这样做行不通。


那么如何使用ParseFile传递myObject? - Nat
你可以将其存储在一个应用程序类中,每个活动都可以访问。 - Ivo
这些myObjects是从云端获取并保存在数组中(该数组会定时刷新)。由于内存管理的原因,我不想将它们全部保存在应用程序中。我应该如何设置/获取这些对象到/从应用程序中? - Nat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接