8

Как передать объект из одной активности в другую на Android

15

Я пытаюсь отправить объект своего класса Customer из одного Activity и отобразить его в другом Activity.

Код для класса Customer:

public class Customer {

    private String firstName, lastName, address;
    int age;

    public Customer(String fname, String lname, int age, String address) {
        firstName = fname;
        lastName = lname;
        age = age;
        address = address;
    }

    public String printValues() {
        String data = null;
        data = "First Name :" + firstName + " Last Name :" + lastName
                + " Age : " + age + " Address : " + address;
        return data;
    }
}

Я хочу отправить объект этого класса из одного Activity в другой и затем отобразить данные в другом Activity.

Как я могу этого достигнуть?

5 ответ(ов)

9

Один из вариантов – сделать так, чтобы ваш пользовательский класс реализовывал интерфейс Serializable. После этого вы можете передавать экземпляры объектов в Intent через метод putExtra(Serializable..), который принимает объекты типа Serializable.

Пример кода:

В вашем пользовательском классе модели:

public class YourClass implements Serializable {
    // Ваши поля и методы
}

В другом классе, где используется ваш пользовательский класс:

// Для передачи:
intent.putExtra("KEY_NAME", myObject);

Здесь myObject - это экземпляр типа YourClass. Чтобы извлечь объект в другой активности, используйте метод getSerializableExtra, указав то же имя ключа. Не забудьте выполнить приведение типа к YourClass:

// Для извлечения объекта во второй активности
myObject = (YourClass) getIntent().getSerializableExtra("KEY_NAME");

Важно: убедитесь, что каждый вложенный класс вашего основного пользовательского класса также реализует интерфейс Serializable, чтобы избежать исключений при сериализации. Например:

class MainClass implements Serializable {
    
    public MainClass() {}

    public static class ChildClass implements Serializable {
         
        public ChildClass() {}
    }
}

Не забывайте про это, чтобы ваша сериализация работала корректно!

3

Чтобы реализовать класс с использованием интерфейса Serializable, вы можете использовать следующий пример, который показывает, как это сделать. Давайте предположим, что у вас есть класс сущности Deneme, который вы уже предоставили:

import java.io.Serializable;

@SuppressWarnings("serial") // С помощью этой аннотации мы скрываем предупреждения компилятора
public class Deneme implements Serializable {

    public Deneme(double id, String name) {
        this.id = id;
        this.name = name;
    }

    public double getId() {
        return id;
    }

    public void setId(double id) {
        this.id = id;
    }

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    private double id;
    private String name;
}

Теперь вы можете отправить объект dene из активности X в активность Y следующим образом:

Deneme dene = new Deneme(4,"Mustafa");
Intent i = new Intent(this, Y.class);
i.putExtra("sampleObject", dene);
startActivity(i);

Для получения объекта в активности Y используйте следующий код:

Intent i = getIntent();
Deneme dene = (Deneme)i.getSerializableExtra("sampleObject");

Теперь в активности Y вы можете использовать объект dene, который вы отправили из активности X. Обязательно помните, что классы, передаваемые через Serializable, должны реализовывать этот интерфейс, как вы сделали в данном примере.

1

Чтобы передать объект Customer между активностями в Android, нужно использовать Parcelable. В приведенном вами коде это уже сделано, но я уточню несколько деталей.

При вызове активности вы используете следующий код:

Intent intent = new Intent(fromClass.this, toClass.class).putExtra("myCustomerObj", customerObj);

В классе toClass объект Customer можно получить следующим образом:

Customer customerObjInToClass = getIntent().getExtras().getParcelable("myCustomerObj");

Обратите внимание, что класс Customer должен реализовывать интерфейс Parcelable. Ваш код уже содержит соответствующую реализацию, что очень хорошо. Вот основные моменты, на которые стоит обратить внимание:

  1. Реализация интерфейса Parcelable: Ваша реализация включает необходимые методы, такие как writeToParcel() и readFromParcel(), что позволяет объекту Customer правильно сериализоваться и десериализоваться.

  2. Создание экземпляра через CREATOR: Вы правильно создали статическую переменную CREATOR, которая необходима для восстановления объекта из Parcel. Убедитесь, что метод createFromParcel возвращает экземпляр вашего класса.

  3. Методы сериализации: Всё выглядит корректно, но не забудьте добавить все необходимые поля в метод writeToParcel, чтобы они корректно сериализовались. В вашем случае все поля уже включены.

  4. Импорт необходимых пакетов: Убедитесь, что у вас импортированы необходимые библиотеки для работы с Parcelable. Это может быть полезно, если вы столкнётесь с ошибками компиляции.

Если у вас возникли какие-то ошибки при передаче объекта, пожалуйста, уточните их, чтобы мы могли помочь быстрее.

0

Вы также можете записать данные объекта во временные строки и целые числа и передать их в активность. Конечно, таким образом вы передаете данные, но не сам объект.

Если же вам нужно просто отобразить эти данные, а не использовать объект в другом методе или чем-то подобном, этого будет достаточно. Я делал так же, чтобы просто отобразить данные из одного объекта в другой активности.

String fName_temp   = yourObject.getFname();
String lName_temp   = yourObject.getLname();
String age_temp     = yourObject.getAge();
String address_temp = yourObject.getAddress();

Intent i = new Intent(this, ToClass.class);
i.putExtra("fname", fName_temp);
i.putExtra("lname", lName_temp);
i.putExtra("age", age_temp);
i.putExtra("address", address_temp);

startActivity(i);

Вы также можете передать их напрямую, вместо временных переменных, но такой способ мне кажется более понятным. Кроме того, вы можете установить временные переменные в null, чтобы они были освобождены сборщиком мусора раньше.

Удачи!

Кстати, лучше переопределите метод toString(), чем писать свой собственный метод для вывода.

Как упоминалось в комментариях ниже, вот как вы можете получить данные в другой активности:

String fName = getIntent().getExtras().getString("fname");
0

Ваш код представляет собой реализацию синглтона, который хранит временные объекты в классе IntentHelper. В целом, он делает то, что задумано, но есть несколько вещей, которые стоит обсудить.

Во-первых, для создания синглтона лучше использовать потокобезопасный подход. В текущей реализации getInstance() не защищена от многопоточных вызовов, что может привести к проблемам в многопоточной среде. Рекомендуется использовать механизм "ленивой инициализации" с синхронизацией или воспользоваться enum для создания синглтона.

Во-вторых, вы используете Hashtable, который синхронизирован, но на практике его замена на ConcurrentHashMap может быть более предпочтительной из-за лучшей производительности в сценариях с высокой конкуренцией.

Вот пример улучшенной версии вашего синглтона:

public class IntentHelper {

    private static IntentHelper _instance;
    private Map<String, Object> _hash;

    private IntentHelper() {
        _hash = new ConcurrentHashMap<>(); // Используем ConcurrentHashMap
    }

    public static IntentHelper getInstance() {
        if(_instance == null) {
            synchronized (IntentHelper.class) { // Добавляем синхронизацию
                if(_instance == null) {
                    _instance = new IntentHelper();
                }
            }
        }
        return _instance;
    }

    public static void addObjectForKey(Object object, String key) {
        getInstance()._hash.put(key, object);
    }

    public static Object getObjectForKey(String key) {
        IntentHelper helper = getInstance();
        Object data = helper._hash.get(key);
        helper._hash.remove(key); // Удаляем объект для избежания лишних ссылок
        return data;
    }
}

Таким образом, теперь ваш IntentHelper будет более безопасным для использования в многопоточной среде. Как вы упомянули, после извлечения объекта он удаляется, что помогает избежать утечек памяти, и это хороший подход.

Использование вашего класса будет точно таким же:

IntentHelper.addObjectForKey(obj, "key");

А в вашем новом Activity:

Object obj = IntentHelper.getObjectForKey("key");

Надеюсь, это поможет вам улучшить ваш код!

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь