使用Serializable通过意图传递数据


72

我已经使用可序列化实现了我的课程,但是仍然无法正常工作。

这是我的课:

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,所以我改用它。


2
Bitmap类没有实现Serializable。您必须在Parcelable这里使用。但是,使用Parcelable...传递位图不是一个好主意
弗拉基米尔·米罗诺夫(Fladimir Mironov)2013年

字节数组呢?它实现了Serializable吗?
Bias Tegaralaga

是的,但是要小心大物件。意图有额外内容的大小限制
Vladimir Mironov

或者您可以像这样private transient Bitmap bitmap;
在位

Answers:


157

尝试使用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");

2
我收到此错误:java.lang.RuntimeException:可打包遇到IOException,正在写入可序列化的对象(名称= com.ursabyte.thumbnail.Thumbnail)
Bias Tegaralaga


问题是位图类未实现@vmironov所说的::)
Bias Tegaralaga

@tegaralaga:是的,我得到了它,然后改变位图图像URL和隔壁班的转换,而不是通过更多的位图到其他活动相关的图像
ρяσѕρєяķ

@tegaralaga:如果此答案有助于解决您当前的问题,请将其标记为答案
谢谢–ρяσsρєяK

13

此代码可以帮助您:

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 
            }
//...

1
对象“ en”即将成为可空值
brunoramonalmeida

7

我扩展了ρяσsρєяK的答案,以使代码完整且可行。因此,当您完成“ all_thumbs”列表的填充时,应将其内容一个接一个地放入捆绑包中,然后放入意图中:

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在需要传输许多数据时考虑使用method,因为Parcelable它是专为Android设计的,并且比效率更高Serializable。您可以Parcelable使用以下方法创建类:

  1. 在线工具-parcelabler
  2. Android Studion的插件-Android可打包代码生成器

6

发送数据:

首先通过实现Serializable数据类来使您的可序列化数据

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

然后把它放进去

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");

这只是一个广为接受的问题的解决方案的一部分。你能详细说明一下吗?
口琴

假设您有一个反对的房屋,则需要序列化一个具有房屋清单的城市。您需要在房屋类和城市类中实现Serializable
Colyn Tidman,

请至少添加一些其他单词来帮助解释它,以改善您的答案。使用编辑按钮而不是添加评论。评论应用于寻求更多信息或提出改进建议。
乔伊,

3
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");

2

您需要创建一个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);

2

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) }
    }

1

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

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

否则,按照这个这个页面。


0

发送List<MySerializableObject>通过意图时,我使用以下方法:

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);
}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.