Передача данных через намерение с использованием 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();
    //  }

}

Это то, что я хочу передать.

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, поэтому я использую это вместо этого.

13 ответов

Попробуйте передать сериализуемый список, используя 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");

Этот код может помочь вам:

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

Я расширил ответ Кейса, чтобы сделать код полным и работоспособным. Итак, когда вы закончите заполнять свой список "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 метод, когда вам нужно передать много данных, потому что Parcelable специально разработан для Android, и это более эффективно, чем Serializable, Вы можете создать Parcelable класс с использованием:

  1. онлайн-инструмент - parcelabler
  2. плагин для Android Studion - Android Генератор парсерабельного кода

Не забудьте реализовать 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 к вашему классу данных

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

В kotlin: Класс объекта реализует Сериализуемый:

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

Вам нужно создать 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);

Создайте свой собственный объект и реализуйте Serializable. Далее вы можете использовать intent.putExtra("package.name.example", <your-serializable-object>),

Во втором упражнении вы читаете его, используя getIntent().getSerializableExtra("package.name.example")

В противном случае, следуйте этой и этой странице.

Чтобы передать список, сначала реализуйте Serializable в своем классе.

Затем вы должны привести свой список к сериализуемому

      val bundle = Bundle();
bundle.putSerializable("list", list as Serializable)

Чтобы получить список в других действиях или фрагментах

      val intent = this.getIntent()
val bundle = intent.getExtras()
val thumbs: List<Thumbnail> = bundle.getSerializable("list") as List<Thumbnail>

1- Вы используете android.graphics.Bitmap, который не реализует класс Serializable, поэтому вам нужно удалить этот класс, тогда он будет работать.

2- для краткости вы можете узнать, как передавать данные между намерениями.

Я использую следующий метод при отправке 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);
}

Если вы здесь, потому что сделали все это, и ваше приложение по-прежнему падает при переключении действий:

Мои проблемы заключались в том, что мой ParentClass использует объект другого класса, в котором я забыл реализовать Serializable.

      public class A implements Serializable {
    
        private B[][] b;
    
}

public class B implements Serializable { //forgot this implementation

    B(){
    }

}
Другие вопросы по тегам