通过用户自定义对象的ArrayList到Android的意图(Pass arraylist of u

2019-08-18 17:11发布

我想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串,其getter和setter方法!

Answer 1:

我已经在直接启动活动调用函数给出实现了两个类序列化,但我越来越无法马歇尔..运行时错误。 请帮助如何入手!

由于您使用序列化 ,你不能做到像现在。 我建议你到你的ArrayList包装类例如名为DataWrapper。 这个类还需要实现Serializable,然后你可以通过意图传递的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 ,你应该使用相同的密钥与任务列表检索它,而不是。



Answer 2:

序列化的实现被认为是高性能低的地方是Parcelable鼓励。

我有相同的问题,同时与仍hassling Parcelable ,我发现静态变量不为任务这样一个坏主意。

你可以简单地创建

public static ArrayList<Parliament> myObjects = .. 

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

我不知道什么公共静态变量与活动的应用程序上下文暗示。 如果您也有关于这个或这种方法的性能方面的疑问,请参考:

  • 什么是共享活动之间数据的最佳方式?
  • 使用Android中的静态变量

干杯。



Answer 3:

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

bundlename.putParcelableArrayList


文章来源: Pass arraylist of user defined objects to Intent android