使用Serializable通过intent传递数据

Bia*_*aga 66 java android android-intent

我已经用serializable实现了我的类,但它仍然没有用.

这是我的班级:

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

}
Run Code Online (Sandbox Code Playgroud)

这就是我想要传递的内容.

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);
Run Code Online (Sandbox Code Playgroud)

但它仍然没有用.我不知道如何使用Parcelable,所以我改用它.

ρяσ*_*я K 145

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

Bundle bundle = new Bundle();
bundle.putSerializable("value", all_thumbs);
intent.putExtras(bundle);
Run Code Online (Sandbox Code Playgroud)

在SomeClass Activity中得到它:

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

List<Thumbnail> thumbs=
               (List<Thumbnail>)bundle.getSerializable("value");
Run Code Online (Sandbox Code Playgroud)

  • 我收到此错误:java.lang.RuntimeException:Parcelable遇到IOException编写可序列化对象(name = com.ursabyte.thumbnail.Thumbnail) (2认同)

Yul*_*mok 12

此代码可以帮助您:

public class EN implements Serializable {
//... you don't need implement any methods when you implements Serializable
}
Run Code Online (Sandbox Code Playgroud)

放数据.使用额外创建新活动:

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

从新活动中获取数据:

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 
            }
//...
Run Code Online (Sandbox Code Playgroud)

  • 对象“en”可以为空 (2认同)

Aya*_*fov 7

我扩展了ρяσѕρєяK的答案,使代码完整可行.因此,当您完成填写'all_thumbs'列表时,您应该将其内容逐个放入包中,然后放入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);
Run Code Online (Sandbox Code Playgroud)

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

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();
Run Code Online (Sandbox Code Playgroud)

优点Serializable是它的简单.但是,我建议您Parcelable在需要传输大量数据时考虑使用方法,因为Parcelable它是专为Android设计的,而且效率更高Serializable.您可以Parcelable使用以下方法创建类

  1. 一个在线工具 - parcelabler
  2. Android Studion的插件 - Android Parcelable代码生成器


Ani*_*bla 6

发送数据:

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

public class YourDataClass implements Serializable {
String someText="Some text";
}
Run Code Online (Sandbox Code Playgroud)

然后放心

YourDataClass yourDataClass=new YourDataClass();
Intent intent = new Intent(getApplicationContext(),ReceivingActivity.class);
intent.putExtra("value",yourDataClass);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)

接收数据:

YourDataClass yourDataClass=(YourDataClass)getIntent().getSerializableExtra("value");
Run Code Online (Sandbox Code Playgroud)


小智 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;
}}
Run Code Online (Sandbox Code Playgroud)

然后 House 需要实现 Serializable :

public class House implements Serializable {

private String name;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}}
Run Code Online (Sandbox Code Playgroud)

然后你可以使用:

Bundle bundle = new Bundle();
bundle.putSerializable("city", city);
intent.putExtras(bundle);
Run Code Online (Sandbox Code Playgroud)

并通过以下方式检索它:

Intent intent = this.getIntent();
Bundle bundle = intent.getExtras();
City city =  (City)bundle.getSerializable("city");
Run Code Online (Sandbox Code Playgroud)