在活动之间传递参数 - null

Posted

技术标签:

【中文标题】在活动之间传递参数 - null【英文标题】:Passing argument between Activities - null 【发布时间】:2013-09-10 14:08:30 【问题描述】:

我正在发送一个实现 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);


该类包含 atm 一个字符串和一个 ParseFile。

我正在尝试将一个对象从一个 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);

在“接收者”活动中:

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

我做错了什么..?我关注了关于 SOF 的另一个问题,但这没有帮助;) 顺便说一句:不,ParseFile 是来自Parse developers的类

【问题讨论】:

要传递用户定义对象,您需要实现 Parsebel 接口而不是 Seriazable @BirajZalavadia Parsebel?是错字吗(你的意思是 Parcelable?)还是我找不到这个? 请贴出 MyObject 和 ParseObject 的代码 我已经更新了问题。请注意,ParseObject 是一个库(我在问题末尾附上了链接)而不是我的对象。 【参考方案1】:

我猜应该是这样的 ParsObject 实现 Serializable 因为根据关于 Serializable 的主题,如果 Super 类不可序列化,则不会维护实例的状态。所以尝试使 ParseObject 类 Serializable 并查看结果

试试这样的东西

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() 有正确的数据,所以它不能为空 你能分享你的 Pojo 课程吗 请粘贴您的 logcat 详细信息 ParseFile 是我无法访问的外部库。如果它尚未可序列化,我无法使其可序列化。我无权访问该课程。我肯定需要使用 ParseFile。 好主意。我无法以这种方式实现它,因为存在一些 Parse 内部问题,但是我已经与一些人聊天并且它消失了,Parse 无论如何都会缓存所有对象,所以最好的想法是再次“下载”它。不管怎样,我会接受这个答案,因为你教会了我一些很有趣的东西。【参考方案2】:

您可以使用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 中也为空。 这并不能解决 OP 的问题,但我确实发现传递一个 byte[] 然后在新活动中创建一个 parseFile 很有用。【参考方案3】:

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

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

我怀疑 ParseFile 是可序列化的,所以这不起作用

【讨论】:

那么如何用 ParseFile 传递 myObject 呢? 您可以将其存储在每个Activity都可以访问的Application类中 这些 myObjects 从云中获取并保存在数组中(不时刷新自身)。由于内存管理,我不想将它们全部保留在 Application 中。我应该如何设置/从应用程序获取这些对象?【参考方案4】:

这是我用来在 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 一直在内存中。 当你用完 ClassName2 之后,你必须从内存中清除它,这样做并不复杂。希望从事移动编程的人非常了解:) 谢谢【参考方案5】:
public class MyObject extends ParseObject implements Serializable 

如果ParseObject 是你的班级?如果是,请尝试将其设为serializable。 还要检查一些android对象不是serializable,以忽略那些使用transient的对象。

也可以使用intent.putSerializable("MyObject", myObject);intent.gettSerializable("MyObject");

【讨论】:

不,解析对象是来自Parse developers的类 检查编辑的答案,如果你粘贴 Whole MyObject 会很好 正如我所说,您需要检查类中的对象是否可序列化。可能是您的解析文件不可序列化

以上是关于在活动之间传递参数 - null的主要内容,如果未能解决你的问题,请参考以下文章

如何在活动之间传递参数?

安卓学习,参数的双向传递

传递 NULL 参数与不传递参数完全相同

(1) 如何向线程对应的函数传递参数?一个参数如何传递,多个参数如何传递? (2) 深入理解线程与进程的

如何在页面之间传递 GCLID

重新创建一个活动并传递参数