【问题标题】:How can I pass a custom object from one activity to another using putExtra()如何使用 putExtra() 将自定义对象从一个活动传递到另一个活动
【发布时间】:2015-06-12 19:52:44
【问题描述】:

我一直在尝试将 array 的对象从一个活动传递到另一个活动。我一直在四处寻找,看来您的对象必须实现ParcelableSerializable。 (这对我来说没有多大意义。我不知道为什么你可以将对象数组传递给putExtra())。我不是想传入一个特定的 int 或 String,而是一组让我们说人对象的数组。但我一直有麻烦。我要传入的对象数组是一个包含bitmap 和一些字符串的对象数组。我试图让我的对象同时实现 Parcelable 和 Serializable 但我不断收到错误。这是我在实现 Serializable 时遇到的错误。有人有任何提示吗?

03-26 20:35:53.886: E/AndroidRuntime(30066): FATAL EXCEPTION: main
03-26 20:35:53.886: E/AndroidRuntime(30066): Process: com.example.test, PID:    30066
03-26 20:35:53.886: E/AndroidRuntime(30066): java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.example.test.Person)
03-26 20:35:53.886: E/AndroidRuntime(30066):    at android.os.Parcel.writeSerializable(Parcel.java:1316)
03-26 20:35:53.886: E/AndroidRuntime(30066):    at android.os.Parcel.writeValue(Parcel.java:1264)
03-26 20:35:53.886: E/AndroidRuntime(30066):    at android.os.Parcel.writeArrayMapInternal(Parcel.java:618)
03-26 20:35:53.886: E/AndroidRuntime(30066):    at android.os.Bundle.writeToParcel(Bundle.java:1692)
03-26 20:35:53.886: E/AndroidRuntime(30066):    at android.os.Parcel.writeBundle(Parcel.java:636)
03-26 20:35:53.886: E/AndroidRuntime(30066):    at android.content.Intent.writeToParcel(Intent.java:7414)
03-26 20:35:53.886: E/AndroidRuntime(30066):    at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:2289)
03-26 20:35:53.886: E/AndroidRuntime(30066):    at android.app.Instrumentation.execStartActivity(Instrumentation.java:1437)
03-26 20:35:53.886: E/AndroidRuntime(30066):    at android.app.Activity.startActivityForResult(Activity.java:3511)
03-26 20:35:53.886: E/AndroidRuntime(30066):    at android.app.Activity.startActivityForResult(Activity.java:3472)  
03-26 20:35:53.886: E/AndroidRuntime(30066):    at android.app.Activity.startActivity(Activity.java:3714)
03-26 20:35:53.886: E/AndroidRuntime(30066):    at android.app.Activity.startActivity(Activity.java:3682)
03-26 20:35:53.886: E/AndroidRuntime(30066):    at    com.example.test.MainActivity$1.onItemClick(MainActivity.java:54)

【问题讨论】:

  • "...object 必须实现 Parcelable 或 Serializable。(这对我来说没有多大意义。" :如果您考虑一下,这完全有道理。使用startActivity(...) 不仅仅用于在您自己的应用程序中启动另一个Activity,并且可能会导致启动第3 方应用程序。由于您的对象存在于您自己的进程中,您需要序列化或打包它们才能通过将它们从您的流程中转移到另一个流程中。

标签: android android-intent android-activity


【解决方案1】:
Intent intent=new Intent(MainActivity.this,secondAcitity.class);                                                                                                                            Bundle extras=new Bundle();                                                     

    YourObject mObject = new YourObject();                                              

    extras.putSerializable("tag",mObject)
    intent.putExtras(extras);
    startActivity(intent);

你的对象

 public class YourObject implements Serializable
    {
private String name;//generate your getters n setter
    }

在第二个活动中

 YourObject receivedmObject = (YourObject ) getIntent().getExtras().getSerializable(
            "tag");

【讨论】:

    【解决方案2】:

    您不想传递位图或包含位图的对象,更不用说包含位图的对象数组了。

    从您的崩溃日志看来,您的 Person 对象也实现了 Parcelable(同时也实现了 Serializable)。删除implements Parcelable,错误就会消失。

    我的建议是你的 Person 对象只包含你的位图的 URI(weblink 或本地存储 uri),并且只在需要时构建位图。

    【讨论】:

    • 我不确定为什么我收到 Parcelable 遇到 IOException。我没有用 Parcelable 实现我的人员类。我正在使用 Serializable 实现它。
    【解决方案3】:

    就我而言,我总是使用单例在两个活动之间共享自定义对象。您也可以使用Parcelable/Serializable

    单例示例: http://pastebin.com/pBeB7FBv

    在你的第一个活动中,

    SharedData sd = SharedData.getInstance();
    sd.setObjectList(your_object_list); 
    

    在你的第二个活动中,

    SharedData sd = SharedData.getInstance();
    ArrayList<Object> myObjList = new ArrayList<Object>;
    myObjList = sd.getObjectList(); 
    

    是徒手写的,所以可能需要稍作调整。

    阅读更多:http://developer.android.com/guide/faq/framework.html#3

    【讨论】:

      【解决方案4】:

      你只能在 Intent 之间传递一个可以 Parcelable 或 Serializable 的对象。 this 就是一个很好的例子

      public class Student implements Parcelable{
          private String id;
          private String name;
          private String grade;
      
          // Constructor
          public Student(String id, String name, String grade){
              this.id = id;
              this.name = name;
              this.grade = grade;
         }
         // Getter and setter methods
         .........
         .........
      
         // Parcelling part
         public Student(Parcel in){
             String[] data = new String[3];
      
             in.readStringArray(data);
             this.id = data[0];
             this.name = data[1];
             this.grade = data[2];
         }
      
         @Оverride
         public int describeContents(){
             return 0;
         }
      
         @Override
         public void writeToParcel(Parcel dest, int flags) {
             dest.writeStringArray(new String[] {this.id,
                                                 this.name,
                                                 this.grade});
         }
         public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
             public Student createFromParcel(Parcel in) {
                 return new Student(in); 
             }
      
             public Student[] newArray(int size) {
                 return new Student[size];
             }
         };
      }
      

      根据您的需要进行更改。 记住 CREATOR 应该定义为public static final Parcelable.Creator

      【讨论】:

        【解决方案5】:

        我也是对象转移的受害者,经历了Gson的可序列化、可打包和使用。最后我成功地使用了Eventbus。 要在两个活动之间传输自定义对象,“EventBus”会很有用。 要设置 EventBus,只需从 here 下载 .jar 并在您的 Android 项目中引用它。

        在您的 SourceActivity 中

        Intent intent = new Intent(this,Destination.class); de.greenrobot.event.EventBus.getDefault().postSticky(your_Object_to_send); startActivity(Intent);

        在您的 DestinationActivity 中

        Object myObject = (Object)EventBus.getDefault().removeStickyEvent(Object.class)

        请注意,不需要复杂的东西。 效率比较由 steven 完成here

        【讨论】:

          【解决方案6】:

          使用 static 关键字访问数组。使用 ClassName.array 从其他类中定义和调用的静态数组

          【讨论】:

          • 这确实有效。我认为这将是一个黑客攻击。但同时工作。
          • 这暂时可以使用,但是将大量内存成员设置为静态的问题是它们不会从堆中清除,从而导致内存泄漏。
          • “使用静态关键字访问数组。”:永远不要在 Activity 中声明 public static 字段或方法,以从任何其他应用程序组件访问它们。在 Android 开发中使用这种设计理念几乎肯定会导致问题。
          • @Squonk 请提供一些真正发生的链接或案例。
          • @Crazy :只需转到 StackOverflow 顶部的搜索框,然后输入“[android]static object in Activity”(不带引号),您就会得到很多搜索结果。特别是,请参阅此问题 stackoverflow.com/questions/4947079/… 和 Commonsware 的答案,其中解释了静态引用如何导致内存泄漏,因为 Activity 不能被垃圾收集。最重要的是,任何当前不可见的Activity 都可能随时被操作系统破坏,从而导致不可预知的状态。
          猜你喜欢
          • 2013-01-12
          • 2011-01-28
          • 1970-01-01
          • 1970-01-01
          • 2012-10-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-04
          相关资源
          最近更新 更多