android - रेलवे पार्सल सेवा शुल्क




किसी अन्य पार्सल के लिए पार्सल के उप वर्ग को लिखें (2)

मेरे पास एक वर्ग है जो Parcelable इंटरफ़ेस को लागू Parcelable है:

class A implements Parcelable {

}

मेरे पास एक और वर्ग B है जिसमें A वस्तु है उदाहरण के चर के रूप में। कक्षा B अंदर writeToPacel , मैं Parcel ऑब्जेक्ट B लिखना चाहता हूं:

class B implements Parcelable{

    public void writeToParcel(Parcel dest, int flags) {
        dest.write ??? 
    }
}

मैं इसे कैसे लिख और पढ़ सकता हूं?


इससे बचने का एक बेहतर तरीका यह है कि रिफ्लेक्सियन से बचने के लिए स्थैतिक निर्माता को केवल लक्ष्य प्रकार में कॉल करना होगा:

this.amazingObject = AmazingObject.CREATOR.createFromParcel(in);

और इसे Parcelable को Parcelable का उपयोग करें this.amazingObject.writeToParcel(Parcel, int)

आंतरिक रूप से, जब कॉल readParcelable(ClassLoader) ऐसा होता है:

public final <T extends Parcelable> T readParcelable(ClassLoader loader) {
    Parcelable.Creator<T> creator = readParcelableCreator(loader);
    if (creator == null) {
        return null;
    }
    if (creator instanceof Parcelable.ClassLoaderCreator<?>) {
        return ((Parcelable.ClassLoaderCreator<T>)creator).createFromParcel(this, loader);
    }
    return creator.createFromParcel(this);
}

जैसा कि आप देख सकते हैं कि इस पद्धति का अंतिम कॉल सिर्फ सही Creator कह रहा है, लेकिन readParcelableCreator अंदर पूरी तरह से प्रतिवर्त है जिसे हम सीधे कॉल करके इससे बच सकते हैं।

यह उपयोगिता कॉल उपयोगी हो सकती है:

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

public class Parcels {

    public static void writeBoolean(Parcel dest, Boolean value) {
        dest.writeByte((byte) (value != null && value ? 1 : 0));
    }

    public static Boolean readBoolean(Parcel in){
        return in.readByte() != 0;
    }

    public static void writeParcelable(Parcel dest, int flags, Parcelable parcelable) {
        writeBoolean(dest, parcelable == null);
        if (parcelable != null) {
            parcelable.writeToParcel(dest, flags);
        }
    }

    public static <T extends Parcelable> T readParcelable(Parcel in, Parcelable.Creator<T> creator) {
        boolean isNull = readBoolean(in);
        return isNull ? null : creator.createFromParcel(in);
    }

}

रेखा:

obj = (A)in.readParcelable(A.class.getClassLoader());

में बदलना चाहिए:

obj = (A)in.readParcelable(B.class.getClassLoader());

मैंने एक ही समस्या का सामना किया और कई Google खोज की, कई वेबपेज या ट्यूटोरियल का सुझाव है कि हम A.class.getClassLoader() उपयोग कर रहे हैं क्योंकि हम A को कास्टिंग कर रहे हैं, लेकिन वास्तव में यह गलत है क्योंकि आपको एक शून्य मान मिलेगा, हमें B.class.getClassLoader() उपयोग करना चाहिए B.class.getClassLoader() क्योंकि codes are INSIDE class B । मुझे अभी पता नहीं था कि क्यों लेकिन इस तरह से इसे सही A ऑब्जेक्ट मिल सकता है।

टिप्पणी और सत्यापन करने के लिए आपका स्वागत है !!





parcelable