【问题标题】:Passing data through intent using Serializable使用 Serializable 通过 Intent 传递数据
【发布时间】:2012-12-29 07:09:58
【问题描述】:

我已经用可序列化实现了我的类,但它仍然没有工作。

这是我的课:

package com.ursabyte.thumbnail;

import java.io.Serializable;

import android.graphics.Bitmap;

public class Thumbnail implements Serializable {

    private static final long serialVersionUID = 1L;
    private String label = "";
    private Bitmap bitmap;

    public Thumbnail(String label, Bitmap bitmap) {
        this.label = label;
        this.bitmap = bitmap;
    }

    public void set_label(String label) {
        this.label = label;
    }

    public String get_label() {
        return this.label;
    }

    public void set_bitmap(Bitmap bitmap) {
        this.bitmap = bitmap;
    }

    public Bitmap get_bitmap(){
        return this.bitmap;
    }

    //  @Override
    //  public int compareTo(Thumbnail other) {
    //      if(this.label != null)
    //          return this.label.compareTo(other.get_label());
    //      else
    //          throw new IllegalArgumentException();
    //  }

}

这就是我想要传递的。

List<Thumbnail> all_thumbs = new ArrayList<Thumbnail>();
all_thumbs.add(new Thumbnail(string, bitmap));
Intent intent = new Intent(getApplicationContext(), SomeClass.class);
intent.putExtra("value", all_thumbs);

但是还是不行。我不知道如何使用 Parcelable,所以我用这个代替。

【问题讨论】:

  • Bitmap 类没有实现Serializable。你必须在这里使用Parcelable。但是,使用Parcelable 传递位图并不是一个好主意...
  • 字节数组呢?它实现了 Serializable 吗?
  • 是的,但要小心大物体。 Intent 对 extras 有大小限制
  • 或者你可以像这样在位图之前添加瞬态private transient Bitmap bitmap;

标签: java android android-intent


【解决方案1】:

尝试使用Bundle.Serializable传递可序列化列表:

Bundle bundle = new Bundle();
bundle.putSerializable("value", all_thumbs);
intent.putExtras(bundle);

在 SomeClass Activity 中得到它:

Intent intent = this.getIntent();
Bundle bundle = intent.getExtras();

List<Thumbnail> thumbs=
               (List<Thumbnail>)bundle.getSerializable("value");

【讨论】:

  • 我得到这个错误:java.lang.RuntimeException: Parcelable 遇到 IOException writing serializable object (name = com.ursabyte.thumbnail.Thumbnail)
  • 问题是 Bitmap 类没有像@vmironov 说的那样实现 Serializabe :)
  • @tegaralaga :是​​的,我明白了,然后将位图更改为图像 url 并在下一个类中转换相关图像,而不是将更多位图传递给其他活动
  • @tegaralaga :如果此答案有助于解决您当前的问题,请将其标记为答案。谢谢
【解决方案2】:

此代码可能会对您有所帮助:

public class EN implements Serializable {
//... you don't need implement any methods when you implements Serializable
}

放入数据。使用额外的创建新活动:

EN enumb = new EN();
Intent intent = new Intent(getActivity(), NewActivity.class);
intent.putExtra("en", enumb); //second param is Serializable
startActivity(intent);

从新活动中获取数据

public class NewActivity extends Activity {

    private EN en;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        try {
            super.onCreate(savedInstanceState);

            Bundle extras = getIntent().getExtras();
            if (extras != null) {
                en = (EN)getIntent().getSerializableExtra("en"); //Obtaining data 
            }
//...

【讨论】:

  • 对象“en”即将为空
【解决方案3】:

我扩展了 ρяσѕρєя K 的答案,以使代码完整且可行。所以,当你填写完你的“all_thumbs”列表后,你应该把它的内容一个一个地放入bundle中,然后放入intent中:

Bundle bundle = new Bundle();

for (int i = 0; i<all_thumbs.size(); i++)
bundle.putSerializable("extras"+i, all_thumbs.get(i));

intent.putExtras(bundle);

为了从意图中获得额外内容,您需要:

Bundle bundle = new Bundle();
List<Thumbnail> thumbnailObjects = new ArrayList<Thumbnail>();

// collect your Thumbnail objects
for (String key : bundle.keySet()) {
thumbnailObjects.add((Thumbnail) bundle.getSerializable(key));
}

// for example, in order to get a value of the 3-rd object you need to:
String label = thumbnailObjects.get(2).get_label();

Serializable 的优点是简单。但是,当您需要传输大量数据时,我建议您考虑使用Parcelable 方法,因为Parcelable 是专为Android 设计的,它比Serializable 更有效。您可以使用以下方法创建Parcelable 类:

  1. 在线工具 - parcelabler
  2. Android Studion 插件 - Android Parcelable code generator

【讨论】:

    【解决方案4】:

    发送数据:

    首先通过在您的数据类中实现Serializable 来制作您的可序列化数据

    public class YourDataClass implements Serializable {
    String someText="Some text";
    }
    

    然后放入intent

    YourDataClass yourDataClass=new YourDataClass();
    Intent intent = new Intent(getApplicationContext(),ReceivingActivity.class);
    intent.putExtra("value",yourDataClass);
    startActivity(intent);
    

    接收数据:

    YourDataClass yourDataClass=(YourDataClass)getIntent().getSerializableExtra("value");
    

    【讨论】:

      【解决方案5】:

      不要忘记在您的对象将使用的每个类中实现 Serializable,就像对象列表一样。否则你的应用会崩溃。

      例子:

      public class City implements Serializable {
      
      private List<House> house;
      
      public List<House> getHouse() {
          return house;
      }
      
      public void setHouse(List<House> house) {
          this.house = house;
      }}
      

      那么House需要这样实现Serializable:

      public class House implements Serializable {
      
      private String name;
      
      public String getName() {
          return name;
      }
      
      public void setName(String name) {
          this.name = name;
      }}
      

      那么你可以使用:

      Bundle bundle = new Bundle();
      bundle.putSerializable("city", city);
      intent.putExtras(bundle);
      

      并使用以下方法检索它:

      Intent intent = this.getIntent();
      Bundle bundle = intent.getExtras();
      City city =  (City)bundle.getSerializable("city");
      

      【讨论】:

      • 这只是一个广受欢迎的问题的解决方案的一部分。能详细点吗?
      • 假设你有一个没有对象的房子,你需要序列化一个有房子列表的城市类。你需要在 House 类和 City 类中实现 Serializable
      • 请至少添加几个词来帮助解释它,从而改进您的答案。使用edit 按钮而不是添加评论。 Comments 应该用于询问更多信息或提出改进建议。
      【解决方案6】:
      Intent intent = new Intent(getApplicationContext(),SomeClass.class);
      intent.putExtra("value",all_thumbs);
      startActivity(intent);
      

      在 SomeClass.java 中

      Bundle b = getIntent().getExtras();
      if(b != null)
      thumbs = (List<Thumbnail>) b.getSerializable("value");
      

      【讨论】:

        【解决方案7】:

        你需要创建一个Bundle,然后使用putSerializable

        List<Thumbnail> all_thumbs = new ArrayList<Thumbnail>();
        all_thumbs.add(new Thumbnail(string,bitmap));
        Intent intent = new Intent(getApplicationContext(),SomeClass.class);
        
        Bundle extras = new Bundle();
        
        extras.putSerializable("value",all_thumbs);
        intent.putExtras(extras);
        

        【讨论】:

          【解决方案8】:

          kotlin 中: 对象类实现 Serializable:

          class MyClass: Serializable {
          //members
          }
          

          在对象发送的点:

          val fragment = UserDetailFragment()
          val bundle = Bundle()
          bundle.putSerializable("key", myObject)
          fragment.arguments = bundle
          

          在片段中,我们想要获取我们的对象:

          val bundle: Bundle? = arguments
              bundle?.let {
                  val myObject = it.getSerializable("key") as MyClass
                  myObject.memberName?.let { it1 -> showShortToast(it1) }
              }
          

          【讨论】:

            【解决方案9】:

            创建您的自定义对象并实现 Serializable。接下来可以使用intent.putExtra("package.name.example", &lt;your-serializable-object&gt;)

            在第二个活动中,您使用getIntent().getSerializableExtra("package.name.example")阅读它

            否则,请关注thisthis 页面。

            【讨论】:

              【解决方案10】:

              我在通过意图发送List&lt;MySerializableObject&gt; 时使用以下方法:

              List<Thumbnail> thumbList = new ArrayList<>();
              //Populate ...
              
              Intent intent = new Intent(context, OtherClass.class);
              intent.putExtra("ThumbArray", thumbList.toArray(new Thumbnail[0]));
              //Send intent...
              

              然后像这样检索它:

              Thumbnail[] thumbArr = (Thumbnail[]) getIntent().getSerializableExtra("ThumbArray");
              if (thumbArr != null) {
                  List<Thumbnail> thumbList = Arrays.asList(thumbArr);
              }
              

              【讨论】:

                【解决方案11】:

                1- 您使用的 android.graphics.Bitmap 没有实现 Serializable 类,因此您必须删除该类然后它才能工作。

                2-简单来说,您可以访问pass data between intents

                【讨论】:

                  【解决方案12】:

                  如果你在这里是因为你做了所有这些并且你的应用仍然在切换活动时崩溃:

                  我的问题在于我的 ParentClass 使用了另一个我忘记实现 Serializable 的类的对象

                  public class A implements Serializable {
                      
                          private B[][] b;
                      
                  }
                  
                  public class B implements Serializable { //forgot this implementation
                  
                      B(){
                      }
                  
                  }
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2013-02-18
                    • 2011-07-19
                    • 1970-01-01
                    • 1970-01-01
                    • 2018-10-19
                    • 2021-09-08
                    相关资源
                    最近更新 更多