Передача объектов пользовательского класса с использованием посылки

Как я могу получить доступ к пользовательскому объекту класса в классе, реализующем посылки

У меня есть разделяемый класс следующим образом

class A implements Parcelable{
      private CustomClass B;
}

Можно ли использовать этот пользовательский класс как обычную переменную во время writeToParcel() и readParcel(Parcel in)?

PS: Я не могу реализовать посылки в классе B, как в модуле, отличном от Android.


person 0x52616A657368    schedule 17.11.2017    source источник
comment
Если вы не можете заставить CustomClass реализовать Parcelable или Serializable, вам придется вручную извлечь его поля/значения и сохранить их как то, что поддерживает Parcel, а затем воссоздать объект позже. Каково точное содержимое CustomClass?   -  person Ben P.    schedule 17.11.2017
comment
4 целочисленные переменные   -  person 0x52616A657368    schedule 17.11.2017


Ответы (2)


В своем комментарии вы говорите, что CustomClass состоит из 4 целочисленных переменных. Поэтому вы можете сделать что-то вроде этого:

class A implements Parcelable {

    private CustomClass B;

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(B.getFirst());
        dest.writeInt(B.getSecond());
        dest.writeInt(B.getThird());
        dest.writeInt(B.getFourth());
    }

    private A(Parcel in) {
        B = new CustomClass();
        B.setFirst(dest.readInt());
        B.setSecond(dest.readInt());
        B.setThird(dest.readInt());
        B.setFourth(dest.readInt());
    }
}
person Ben P.    schedule 17.11.2017
comment
Что, если мой пользовательский класс также состоит из одного JSONObject? Что я могу сделать? - person kks21199; 23.08.2018

Сначала вам нужно сделать свой CustomClass parcelable как в

class CustomClass implements Parcelable{
   // write logic to write and read from parcel
}

Затем в вашем классе A

class A implements Parcelable{
      private CustomClass B;

       @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeParcelable(B, flags); // saving object 
    }

    private A(Parcel in) {
        this.B= in.readParcelable(CustomClass.class.getClassLoader()); //retrieving from parcel
    }
}

ИЗМЕНИТЬ

Если вы не можете сделать CustomClass как Parcelable, преобразуйте класс как Json String с помощью Google gson и запишите его в Parcel, а во время чтения прочитайте String и преобразуйте обратно в object

class A implements Parcelable{
      private CustomClass B;

       @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(new Gson().toJson(B), flags); // saving object 
    }

    private A(Parcel in) {
        this.B= new Gson().fromJson(in.readString(),CustomClass.class); //retrieving string and convert it to object and assign
    }
}
person Rajan Kali    schedule 17.11.2017
comment
я пользовательский класс не поддерживает Android, он находится в отдельном модуле - person 0x52616A657368; 17.11.2017
comment
спасибо Раджан за помощь, хорошее решение, но я думаю, что я выберу решение @Ben, не загружая дополнительную библиотеку - person 0x52616A657368; 18.11.2017