【问题标题】:Pass arraylist of user defined objects to Intent android将用户定义对象的数组列表传递给 Intent android
【发布时间】:2013-03-22 18:43:36
【问题描述】:

我正在尝试将 arraylist 的结构传递给一个意图,如下所示, 在我正在使用的调用函数中

ArrayList<Parliament> s=(ArrayList<Parliament>)msg.obj;                                 
Intent i = new Intent(ReadTasks.this, GenrateTasks.class);                          
i.putExtra("tasks", s);
startActivity(i);

在被调用函数中

Bundle b = getIntent().getExtras();
if(b!=null)
{           
    ArrayList<Parliament> as = (ArrayList<Parliament>)b.getSerializable("tasklist");
}

我在这两个类中都给出了可序列化的实现,但是我无法编组.. 在线启动活动中调用函数中的运行时错误。请帮助如何进行!

编辑 1:堆栈跟踪:

04-01 22:21:53.999: E/AndroidRuntime(2078): FATAL EXCEPTION: main
04-01 22:21:53.999: E/AndroidRuntime(2078): java.lang.RuntimeException: Parcel: unable to marshal value com.viralm.readjson.Parliament@413597f0
04-01 22:21:53.999: E/AndroidRuntime(2078):     at android.os.Parcel.writeValue(Parcel.java:1137)
04-01 22:21:53.999: E/AndroidRuntime(2078):     at android.os.Parcel.writeList(Parcel.java:524)
04-01 22:21:53.999: E/AndroidRuntime(2078):     at android.os.Parcel.writeValue(Parcel.java:1097)
04-01 22:21:53.999: E/AndroidRuntime(2078):     at android.os.Parcel.writeMapInternal(Parcel.java:493)
04-01 22:21:53.999: E/AndroidRuntime(2078):     at android.os.Bundle.writeToParcel(Bundle.java:1612)
04-01 22:21:53.999: E/AndroidRuntime(2078):     at android.os.Parcel.writeBundle(Parcel.java:507)
04-01 22:21:53.999: E/AndroidRuntime(2078):     at android.content.Intent.writeToParcel(Intent.java:5846)
04-01 22:21:53.999: E/AndroidRuntime(2078):     at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:1606)
04-01 22:21:53.999: E/AndroidRuntime(2078):     at android.app.Instrumentation.execStartActivity(Instrumentation.java:1379)
04-01 22:21:53.999: E/AndroidRuntime(2078):     at android.app.Activity.startActivityForResult(Activity.java:3190)
04-01 22:21:53.999: E/AndroidRuntime(2078):     at android.app.Activity.startActivity(Activity.java:3297)
04-01 22:21:53.999: E/AndroidRuntime(2078):     at com.viralm.readjson.ReadTasks$1.handleMessage(ReadTasks.java:61)
04-01 22:21:53.999: E/AndroidRuntime(2078):     at android.os.Handler.dispatchMessage(Handler.java:99)
04-01 22:21:53.999: E/AndroidRuntime(2078):     at android.os.Looper.loop(Looper.java:137)
04-01 22:21:53.999: E/AndroidRuntime(2078):     at android.app.ActivityThread.main(ActivityThread.java:4340)
04-01 22:21:53.999: E/AndroidRuntime(2078):     at java.lang.reflect.Method.invokeNative(Native Method)
04-01 22:21:53.999: E/AndroidRuntime(2078):     at java.lang.reflect.Method.invoke(Method.java:511)
04-01 22:21:53.999: E/AndroidRuntime(2078):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
04-01 22:21:53.999: E/AndroidRuntime(2078):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
04-01 22:21:53.999: E/AndroidRuntime(2078):     at dalvik.system.NativeStart.main(Native Method)

我的 Parliment 类有 5 个带有 setter 和 getter 的字符串!

【问题讨论】:

标签: android android-intent bundle extras


【解决方案1】:

我在这两个类中都给出了可序列化的实现,但是我 无法编组..调用函数中的运行时错误 线开始活动。请帮助如何进行!

由于您使用的是Serializable,因此您不能像现在这样。我建议您将 ArrayList 包装到名为 DataWrapper 的类中。这个类还需要实现 Serializable ,然后你就可以通过 Intent 传递 ArrayList 了。

示例:

public class DataWrapper implements Serializable {

   private ArrayList<Parliament> parliaments;

   public DataWrapper(ArrayList<Parliament> data) {
      this.parliaments = data;
   }

   public ArrayList<Parliament> getParliaments() {
      return this.parliaments;
   }

}

还有一个用法:

Intent i = new Intent(...);
i.putExtra("data", new DataWrapper(yourArrayList));

并检索:

DataWrapper dw = (DataWrapper) getIntent().getSerializableExtra("data");
ArrayList<Parliament> list = dw.getParliaments();

注意:

还有使用Parcelable接口的选项。如果您将使用它,您可以使用以下方法放置和检索您的 ArrayList:

intent.putParcelableArrayListExtra("key", ArrayList<T extends Parcelable> list);
getIntent().getParcelableArrayListExtra("key");


一般建议使用 Parcelable 接口,它直接指定用于通过活动传递对象,但我通常使用 Serializable 接口,它总是有技巧。

还要小心拼写错误。您正在使用键 task 放置对象,您应该使用 same key 而不是任务列表来检索它。

【讨论】:

  • 您好,感谢您的回复,当我尝试实现创建包装器并仅在其中实现可序列化时,我得到“04-01 22:39:13.499: E/AndroidRuntime(2202): java .lang.RuntimeException: Parcelable遇到IOException writing serializable object (name = com.viralm.readjson.DataWrapper)”,怎么办?
  • @bharath 可序列化需要实现两个类、包装器和议会。
  • @bharath 你把对象放在意图不捆绑。所以你需要打电话给getIntent().getSerializableExtra("key");
  • @bharath 不客气(也不要忘记接受他人的回答)谢谢
【解决方案2】:

在鼓励使用 Parcelable 的情况下,Serializable 的实现被认为是低性能的。

我也有同样的问题,虽然还在纠结Parcelable,但我发现静态变量对于这项任务来说并不是一个坏主意。

你可以简单地创建一个

public static ArrayList<Parliament> myObjects = .. 

并通过MyRefActivity.myObjects从其他地方使用它

我不确定公共静态变量在具有活动的应用程序的上下文中意味着什么。如果您对此方法或此方法的性能方面也有疑问,请参阅:

干杯。

【讨论】:

    【解决方案3】:

    让你的对象类 Parcelable 稍后尝试使用

    bundlename.putParcelableArrayList
    

    【讨论】:

      猜你喜欢
      • 2018-12-30
      • 1970-01-01
      • 1970-01-01
      • 2014-03-12
      • 2017-03-21
      • 1970-01-01
      • 1970-01-01
      • 2021-09-19
      • 2013-02-10
      相关资源
      最近更新 更多