मैं अपनी कस्टम वस्तुओं को कैसे पार्सल कर सकता हूं?


338

मैं अपनी वस्तुओं को पार्सल करने की कोशिश कर रहा हूं। हालाँकि, मेरे पास कस्टम ऑब्जेक्ट्स हैं और उन ऑब्जेक्ट्स में ArrayListमेरे द्वारा बनाई गई अन्य कस्टम ऑब्जेक्ट्स की विशेषताएँ हैं।

क्या सबसे अच्छा तरीका होगा यह करने का?

जवाबों:


431

आप इसके कुछ उदाहरण यहाँ , (यहाँ कोड लिया गया है) और यहाँ देख सकते हैं

आप इसके लिए एक POJO क्लास बना सकते हैं, लेकिन इसे बनाने के लिए आपको कुछ अतिरिक्त कोड जोड़ना होगा Parcelable। कार्यान्वयन पर एक नजर है।

public class Student implements Parcelable{
        private String id;
        private String name;
        private String grade;

        // Constructor
        public Student(String id, String name, String grade){
            this.id = id;
            this.name = name;
            this.grade = grade;
       }
       // Getter and setter methods
       .........
       .........

       // Parcelling part
       public Student(Parcel in){
           String[] data = new String[3];

           in.readStringArray(data);
           // the order needs to be the same as in writeToParcel() method
           this.id = data[0];
           this.name = data[1];
           this.grade = data[2];
       }

       verride
       public int describeContents(){
           return 0;
       }

       @Override
       public void writeToParcel(Parcel dest, int flags) {
           dest.writeStringArray(new String[] {this.id,
                                               this.name,
                                               this.grade});
       }
       public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
           public Student createFromParcel(Parcel in) {
               return new Student(in); 
           }

           public Student[] newArray(int size) {
               return new Student[size];
           }
       };
   }

एक बार जब आप इस वर्ग को बना लेते हैं, तो आप इस Intentतरह की वस्तुओं को आसानी से इस तरह से पास कर सकते हैं , और लक्ष्य गतिविधि में इस ऑब्जेक्ट को पुनर्प्राप्त कर सकते हैं ।

intent.putExtra("student", new Student("1","Mike","6"));

यहां, छात्र वह कुंजी है जिसे आपको बंडल से डेटा को अनइंस्टॉल करने की आवश्यकता होगी।

Bundle data = getIntent().getExtras();
Student student = (Student) data.getParcelable("student");

यह उदाहरण केवल Stringप्रकार दिखाता है । लेकिन, आप किसी भी तरह का डेटा पार्सल कर सकते हैं। कोशिश करके देखो।

EDIT: रुक्मल डायस द्वारा सुझाया गया एक और उदाहरण


@Rukmal Dias 10x वास्तव में, मुझे अपना उत्तर संपादित करना होगा और कुछ कोड जोड़ना होगा, क्योंकि ये लिंक भविष्य में किसी दिन सक्रिय नहीं होंगे।
कथा

16
ओपी पूछ रहा है कि कैसे कस्टम वस्तुओं को पारित करने के लिए नियमित स्ट्रिंग नहीं। कोई भी नियमित स्ट्रिंग्स पास कर सकता है। क्या आप इसे कस्टम OBJECT के साथ बनाने के लिए समझा सकते हैं

क्या मुझे वास्तव में एन्कोडिंग / डिकोडिंग भागों को लागू करना है अगर मैं उन्हें केवल LocalBroadcastManager का उपयोग करके भेजूं? क्या यह पार्सलबल को लागू करने और अतिरिक्त के रूप में लागू करने के लिए पर्याप्त है?
जॉनीटेक्स

आप केवल स्ट्रिंग को क्रमिक रूप से लिखने के बजाय एक स्ट्रिंग सरणी का उपयोग क्यों करते हैं?
क्वेंटिन रॉय

writeToParcelविधि के मामले के अंदर स्ट्रिंग सरणी बनाते समय सदस्यों का क्रम क्या है?
प्रखर मोहन श्रीवास्तव


113

IntelliJ IDEA और Android Studio के पास इसके लिए प्लग इन हैं:

ये प्लगइन्स क्लास में फ़ील्ड के आधार पर एंड्रॉइड पार्सलेबल बॉयलरप्लेट कोड उत्पन्न करते हैं।

प्लगइन डेमो


उस सामान को करने का एक नया तरीका TIL, नीस!
सूद 29००

56

1. आयात Android Parcelable code generator

यहां छवि विवरण दर्ज करें

2. एक कक्षा बनाएँ

public class Sample {
    int id;
    String name;
}

3. मेनू से उत्पन्न करें

यहां छवि विवरण दर्ज करें यहां छवि विवरण दर्ज करें

किया हुआ।


7
उन लोगों के लिए जो यह नहीं जानते कि ब्राउज रिपॉजिटरी डायलॉग कहां है: File > Settings... > Pluginsऔर Browse repositories...बटन पर क्लिक करें।
डेडलसअल्फा

धन्यवाद, बहुत मदद की!
स्ट्रिन्हिन्जा अजवाज़

21

कैसे? एनोटेशन के साथ।

आप बस एक विशेष एनोटेशन के साथ एक POJO एनोटेट करते हैं और लाइब्रेरी बाकी काम करता है।

चेतावनी!

मुझे यकीन नहीं है कि एंड्रॉइड के नए बिल्ड सिस्टम के साथ हैरिस, लोम्बोक और अन्य कोड जनरेशन लाइब्रेरी संगत हैं। वे हॉट स्वैपिंग कोड (यानी jRebel, इंस्टेंट रन) के साथ अच्छी तरह से खेल सकते हैं या नहीं।

पेशेवरों:

  • कोड जनरेशन लाइब्रेरी आपको बॉयलरप्लेट स्रोत कोड से बचाती है।
  • एनोटेशन आपकी कक्षा को सुंदर बनाते हैं।

विपक्ष:

  • यह सरल वर्गों के लिए अच्छी तरह से काम करता है। एक जटिल वर्ग को पार्सल योग्य बनाना मुश्किल हो सकता है।
  • लोम्बोक और एस्पेक्टज एक साथ अच्छा नहीं खेलते हैं। [विवरण]
  • मेरी चेतावनी देखिए।

Hrisey

चेतावनी!

Hrisey का जावा 8 के साथ एक ज्ञात मुद्दा है और इसलिए इसे आजकल Android विकास के लिए उपयोग नहीं किया जा सकता है। देखें # 1 प्रतीक त्रुटियों को नहीं पा सकता (JDK 8)

Hrisey पर आधारित है लंबोक । Parcelable वर्ग का उपयोग कर Hrisey :

@hrisey.Parcelable
public final class POJOClass implements android.os.Parcelable {
    /* Fields, accessors, default constructor */
}

अब आपको पार्सलेबल इंटरफ़ेस के किसी भी तरीके को लागू करने की आवश्यकता नहीं है। ह्रीसे प्रीप्रोसेसिंग चरण के दौरान सभी आवश्यक कोड उत्पन्न करेगा।

ग्रैडल निर्भरता में हैरिस:

provided "pl.mg6.hrisey:hrisey:${hrisey.version}"

समर्थित प्रकारों के लिए यहां देखेंArrayListउन के बीच में है।

अपनी IDE के लिए एक प्लगइन - Hrisey xor लंबोक * स्थापित करें और इसकी अद्भुत विशेषताओं का उपयोग शुरू करें!

यहां छवि विवरण दर्ज करें
* Hrisey और Lombok प्लगइन्स को एक साथ सक्षम न करें या आपको IDE लॉन्च के दौरान कोई त्रुटि मिलेगी।


Parceler

Parcelable वर्ग का उपयोग कर Parceler :

@java.org.parceler.Parcel
public class POJOClass {
    /* Fields, accessors, default constructor */
}

उत्पन्न कोड का उपयोग करने के लिए, आप सीधे उत्पन्न वर्ग का संदर्भ ले सकते हैं, या Parcelsउपयोगिता वर्ग का उपयोग कर सकते हैं

public static <T> Parcelable wrap(T input);

के संदर्भ में @Parcel, Parcelsकक्षा की निम्नलिखित विधि को कहें

public static <T> T unwrap(Parcelable input);

ग्रेडल निर्भरताओं में पार्सलर:

compile "org.parceler:parceler-api:${parceler.version}"
provided "org.parceler:parceler:${parceler.version}"

समर्थित विशेषता प्रकारों के लिए README में देखें ।


AutoParcel

AutoParcel एक AutoValue एक्सटेंशन है जो Parcelable values ​​जनरेशन को सक्षम करता है।

बस implements Parcelableअपने @AutoValueएनोटेट मॉडल में जोड़ें :

@AutoValue
abstract class POJOClass implements Parcelable {
    /* Note that the class is abstract */
    /* Abstract fields, abstract accessors */

    static POJOClass create(/*abstract fields*/) {
        return new AutoValue_POJOClass(/*abstract fields*/);
    }
}

ग्रेडल बिल्ड फ़ाइल में AutoParcel:

apply plugin: 'com.android.application'
apply plugin: 'com.neenbedankt.android-apt'

repositories {
    /*...*/
    maven {url "https://clojars.org/repo/"}
}

dependencies {
    apt "frankiesardo:auto-parcel:${autoparcel.version}"
}

PaperParcel

पेपरपर्ल एक एनोटेशन प्रोसेसर है जो स्वचालित रूप से कोटलिन और जावा के लिए टाइप-सेफ पार्सलेबल बॉयलरप्लेट कोड बनाता है। पेपरपर्ल, कोटलिन डेटा क्लासेस, गूगल के ऑटोवैल्यू को एक ऑटोवैल्यू एक्सटेंशन या सिर्फ नियमित जावा बीन ऑब्जेक्ट के माध्यम से समर्थन करता है।

डॉक्स से उदाहरण का उपयोग करें । उदाहरण के लिए, JVM स्थिर उदाहरण के
साथ अपने डेटा वर्ग को एनोटेट करें @PaperParcel, कार्यान्वित करें PaperParcelableऔर जोड़ें PaperParcelable.Creator:

@PaperParcel
public final class Example extends PaperParcelable {
    public static final PaperParcelable.Creator<Example> CREATOR = new PaperParcelable.Creator<>(Example.class);

    private final int test;

    public Example(int test) {
        this.test = test;
    }

    public int getTest() {
        return test;
    }
}

कोटलिन उपयोगकर्ताओं के लिए, कोटलिन उपयोग देखें ; AutoValue उपयोगकर्ताओं के लिए, AutoValue उपयोग देखें ।


ParcelableGenerator

ParcelableGenerator (README चीनी में लिखा गया है और मुझे यह समझ में नहीं आता है। अंग्रेजी-चीनी भाषी डेवलपर्स के इस उत्तर में योगदान का स्वागत है)

README से उपयोग उदाहरण ।

import com.baoyz.pg.Parcelable;

@Parcelable
public class User {

    private String name;
    private int age;

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

}

Android-उपयुक्त एंड्रॉयड स्टूडियो के साथ संयोजन में एनोटेशन प्रोसेसर के साथ काम करने में सहायता करता है प्लगइन।


7

मुझे Parcelable class बनाने का सबसे सरल तरीका मिल गया है

यहां छवि विवरण दर्ज करें


1
यह छोटे डेटा के लिए अच्छी तरह से काम करता है, लेकिन अगर हम जटिल डेटा लेते हैं तो यह काम नहीं करेगा
मनोहर रेड्डी

1

यह बहुत आसान है, आप ऑब्जेक्ट पार्सलबेल बनाने के लिए एंड्रॉइड स्टूडियो पर एक प्लगइन का उपयोग कर सकते हैं।

public class Persona implements Parcelable {
String nombre;
int edad;
Date fechaNacimiento;

public Persona(String nombre, int edad, Date fechaNacimiento) {
    this.nombre = nombre;
    this.edad = edad;
    this.fechaNacimiento = fechaNacimiento;
}

@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(this.nombre);
    dest.writeInt(this.edad);
    dest.writeLong(fechaNacimiento != null ? fechaNacimiento.getTime() : -1);
}

protected Persona(Parcel in) {
    this.nombre = in.readString();
    this.edad = in.readInt();
    long tmpFechaNacimiento = in.readLong();
    this.fechaNacimiento = tmpFechaNacimiento == -1 ? null : new Date(tmpFechaNacimiento);
}

public static final Parcelable.Creator<Persona> CREATOR = new Parcelable.Creator<Persona>() {
    public Persona createFromParcel(Parcel source) {
        return new Persona(source);
    }

    public Persona[] newArray(int size) {
        return new Persona[size];
    }
};}

4
क्या मतलब है प्लगइन?
naXa

0

अब आप अपने किसी भी कस्टम वर्ग को पार्सल में बदलने के लिए पार्सलर लाइब्रेरी का उपयोग कर सकते हैं । बस अपने POJO वर्ग को @ पार्सल के साथ एनोटेट करें । जैसे

    @Parcel
    public class Example {
    String name;
    int id;

    public Example() {}

    public Example(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public String getName() { return name; }

    public int getId() { return id; }
}

आप उदाहरण वर्ग की एक वस्तु बना सकते हैं और पार्सल के माध्यम से लपेट सकते हैं और इरादे के माध्यम से एक बंडल के रूप में भेज सकते हैं। जैसे

Bundle bundle = new Bundle();
bundle.putParcelable("example", Parcels.wrap(example));

अब कस्टम क्लास ऑब्जेक्ट का उपयोग करने के लिए

Example example = Parcels.unwrap(getIntent().getParcelableExtra("example"));

0

एंड्रॉइड पार्सबल में कुछ अनोखी चीजें हैं। उन लोगों को दिया जाता है:

  1. आपको पार्सल को उसी आदेश के रूप में पढ़ना होगा जहां आप पार्सल पर डेटा डालते हैं।
  2. पार्सल से पढ़ने के बाद पार्सल खाली हो जाएगा। अगर आपके पास अपने पार्सल पर 3 डेटा है। फिर 3 बार पढ़ने के बाद पार्सल खाली हो जाएगा।

उदाहरण: एक वर्ग Parceble बनाने के लिए Parceble को लागू करना चाहिए। Percable में 2 विधि है:

int describeContents();
void writeToParcel(Parcel var1, int var2);

मान लीजिए कि आपके पास एक व्यक्ति वर्ग है और इसके 3 क्षेत्र हैं, पहला नाम, अंतिम नाम और आयु। Parceble इंटरफ़ेस को लागू करने के बाद। इस इंटरफ़ेस को bellow दिया गया है:

import android.os.Parcel;
import android.os.Parcelable;
public class Person implements Parcelable{
    private String firstName;
    private String lastName;
    private int age;

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getAge() {
        return age;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel parcel, int i) {
        parcel.writeString(firstName);
        parcel.writeString(lastName);
        parcel.writeInt(age);
    }

}

यहां writeToParcelहम एक क्रम में पार्सल पर डेटा लिख ​​/ जोड़ रहे हैं। इसके बाद हमें पार्सल से डेटा पढ़ने के लिए bellow कोड जोड़ना होगा:

protected Person(Parcel in) {
        firstName = in.readString();
        lastName = in.readString();
        age = in.readInt();
    }

    public static final Creator<Person> CREATOR = new Creator<Person>() {
        @Override
        public Person createFromParcel(Parcel in) {
            return new Person(in);
        }

        @Override
        public Person[] newArray(int size) {
            return new Person[size];
        }
    };

यहां, व्यक्ति वर्ग पार्सल ले रहा है और लेखन के दौरान उसी क्रम में डेटा प्राप्त कर रहा है।

अब इरादे getExtraऔर putExtraकोड के दौरान bellow दिया गया है:

अतिरिक्त में रखो :

Person person=new Person();
                person.setFirstName("First");
                person.setLastName("Name");
                person.setAge(30);

                Intent intent = new Intent(getApplicationContext(), SECOND_ACTIVITY.class);
                intent.putExtra()
                startActivity(intent); 

अतिरिक्त प्राप्त करें:

Person person=getIntent().getParcelableExtra("person");

पूर्ण व्यक्ति वर्ग को दिया जाता है :

import android.os.Parcel;
import android.os.Parcelable;

public class Person implements Parcelable{
    private String firstName;
    private String lastName;
    private int age;



    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getAge() {
        return age;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel parcel, int i) {
        parcel.writeString(firstName);
        parcel.writeString(lastName);
        parcel.writeInt(age);
    }

    protected Person(Parcel in) {
        firstName = in.readString();
        lastName = in.readString();
        age = in.readInt();
    }

    public static final Creator<Person> CREATOR = new Creator<Person>() {
        @Override
        public Person createFromParcel(Parcel in) {
            return new Person(in);
        }

        @Override
        public Person[] newArray(int size) {
            return new Person[size];
        }
    };

}

Hope this will help you 
Thanks :)

0

एंड्रॉइड स्टूडियो में प्लगइन के बिना पार्सलेबल क्लास बनाएं

अपनी कक्षा में पार्सेलेबल लागू करता है और फिर "इम्प्लीमेंट्स पार्सलेबल" पर कर्सर रखता है और हिट Alt+Enterऔर सेलेक्ट Add Parcelable implementation(चित्र देखें) करता है। बस।

यहां छवि विवरण दर्ज करें


-3

रखना: bundle.putSerializable("key",(Serializable) object);

लेना: List<Object> obj = (List<Object>)((Serializable)bundle.getSerializable("key"));


3
यह तब होगा ClassCastExceptionजब ऑब्जेक्ट लागू नहीं होता है Serializable
naXa

1
हालांकि यह कोड स्निपेट प्रश्न को हल कर सकता है, जिसमें स्पष्टीकरण सहित वास्तव में आपकी पोस्ट की गुणवत्ता में सुधार करने में मदद करता है। याद रखें कि आप भविष्य में पाठकों के लिए प्रश्न का उत्तर दे रहे हैं, और उन लोगों को आपके कोड सुझाव के कारणों का पता नहीं चल सकता है। कृपया व्याख्यात्मक टिप्पणियों के साथ अपने कोड को भीड़ने की कोशिश न करें, इससे कोड और स्पष्टीकरण दोनों की पठनीयता कम हो जाती है!
आशीष आहूजा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.