将用户定义对象的ArrayList传递给Intent Android

9

我将尝试传递一个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方法!


请发布完整的堆栈跟踪并添加类Parliament。 - WarrenFaith
http://androidhub.wordpress.com/2011/08/03/android-intents-for-passing-data-between-activities-part-3/ - Raghunandan
3个回答

44

我已经在这两个类中都使用了Serializable接口,但是在调用函数的时候出现了无法序列化的运行时错误,错误发生在启动Activity的代码行。请帮我解决这个问题!

由于您正在使用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接口来直接传递对象通过Activities,但我通常使用Serializable接口,它总是起到了作用。
此外要注意拼写错误。您正在使用键为“task”的对象,应该使用相同的键而不是tasklist来检索它。

非常感谢您的回复。当我尝试创建一个包装器并仅在该包装器中实现Serializable时,出现了以下错误:“04-01 22:39:13.499:E / AndroidRuntime(2202):java.lang.RuntimeException:Parcelable遇到IOException写入可序列化对象(名称= com.viralm.readjson.DataWrapper)”。请问该怎么办? - bharath
2
@bharath Serializable需要实现两个类,包装器和议会。 - Simon Dorociak
@bharath和你将对象放入意图而不是捆绑包中。因此,您需要调用getIntent().getSerializableExtra("key") - Simon Dorociak

3

实现Serializable被认为是低性能的,而Parcelable则被推荐使用。

我曾经有过完全相同的问题,当我还在纠结于Parcelable时,我发现对于此任务来说,静态变量并不是一个坏主意。

你可以简单地创建一个

public static ArrayList<Parliament> myObjects = .. 

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

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

干杯。


1
稍后将您的对象类设置为可包含,然后尝试使用。
bundlename.putParcelableArrayList

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