2012-01-27 7 views
8

मुझे यह जानने की ज़रूरत है कि एक आंतरिक वर्ग पार्सेलबल कैसे बनाया जाए ताकि उसके प्रकार की वस्तुओं को एआईडीएल के माध्यम से रिमोट सेवा में पारित किया जा सके। मुझे इस पर कोई जानकारी नहीं मिल रही है।एक आंतरिक वर्ग पार्सलबल बनाने के लिए कैसे करें

यहां जो कुछ मैं पूरा करने की कोशिश कर रहा हूं उसका उदाहरण कोड है, लेकिन यह संकलित नहीं होता है क्योंकि बार वर्ग में CREATOR स्थिर नहीं हो सकता है (यानी क्योंकि यह एक आंतरिक कक्षा में है)। मैं बार को एक स्थिर आंतरिक कक्षा नहीं बना सकता और मैं फू वर्ग (सिस्टम के भीतर अन्य निर्भरताओं) के बाहर बार को स्थानांतरित नहीं कर सकता। मुझे यह भी जानने की जरूरत है कि मैं एआईडीएल फ़ाइल के भीतर से बार क्लास का संदर्भ कैसे दूंगा। कोई भी मदद बहुत ही सराहनीय होगी।

public class Foo implements Parcelable 
{ 
    private int a; 

    public Foo() 
    { 
    } 

    public Foo(Parcel source) 
    { 
     this.a = source.readInt(); 
    } 

    public int describeContents() 
    { 
     return 0; 
    } 

    public void writeToParcel(Parcel dest, int flags) 
    { 
     dest.writeInt(this.a); 
    } 

    public static final Parcelable.Creator<Foo> CREATOR 
    = new Parcelable.Creator<Foo>() 
    { 
     ... 
    } 

    public class Bar implements Parcelable 
    { 
     private int b; 

     public Bar() 
     { 
     } 

     public Bar(Parcel source) 
     { 
      this.b = source.readInt(); 
     } 

     public int describeContents() 
     { 
      return 0; 
     } 

     public void writeToParcel(Parcel dest, int flags) 
     { 
      dest.writeInt(this.b); 
     } 

     public static final Parcelable.Creator<Bar> CREATOR 
     = new Parcelable.Creator<Bar>() 
     { 
      ... 
     } 
    } 
} 
+0

आप http://stackoverflow.com/questions/35923039/android-implementing-parcelable-inner-class इस तुम्हारी मदद करेगा में एक बार देख ले सकते हैं:

यहाँ कुछ कोड सामने उदाहरण है। – chaitanya

+0

इस समाधान में एक नज़र डालें। यह आपकी मदद करेगा http://stackoverflow.com/questions/35923039/android-implementing-parcelable-inner-class – chaitanya

उत्तर

3

उत्तर यह है कि एक आंतरिक वर्ग हमेशा अपनी कक्षा में बनाया जा सकता है। बाहरी कक्षा या vise विपरीत के उदाहरण से आंतरिक वर्ग को जो भी कार्यक्षमता तक पहुंचने की आवश्यकता है, वह हमेशा इंटरफेस या सार्वजनिक एपीआई के माध्यम से किया जा सकता है। बार को अपनी कक्षा बनाने का प्रयास करें। फू बार के जो भी घटकों तक पहुंच की आवश्यकता है, बार में फू का उदाहरण पास करके प्रदान करें और उपयुक्त एपीआई लागू करें।

+0

आपकी प्रतिक्रिया के लिए धन्यवाद। हाँ, यह आदर्श समाधान होगा। हालांकि, मुझे कुछ जेनी कोड के साथ इंटरफ़ेस करना है (जिसके लिए मेरे पास सी ++ रीकंपाइल नहीं है) जो कि Foo.Bar की अपेक्षा कर रहा है (और यदि बार बार हो तो क्रैश हो जाता है)। – MichaelL

1

अपने बाहरी वर्ग भीतरी वर्ग उदाहरणों के लिए एक संदर्भ रहता है, तो आप इसे इस तरह से कर सकता है:

public class OuterClass implements Parcelable 
{ 
    private InnerClass reference; 

    protected OuterClass(Parcel source) 
    { 
     this.reference = new InnerClass(source); 
     // ... 
    } 

    @Override 
    public void writeToParcel(Parcel destination, int flags) 
    { 
     reference.writeToParcel(destination, flags); 
     // ... 
    } 

    public class InnerClass implements Parcelable 
    { 
     protected InnerClass(Parcel source) 
     { 
      // Read from your parcel. 
     } 

     @Override 
     public void writeToParcel(Parcel destination, int flags) 
     { 
      // Write to your parcel. 
     } 
    } 

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

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

मैं हाल ही में एक ही समस्या में और भीतरी वर्ग स्थिर मेरी स्थिति में काम कर रही है भाग गया।

मैं पढ़ता हूं कि यह वास्तव में क्यों काम करेगा और यह मेरे लिए अधिक समझ में आता है, इसलिए मैंने सोचा कि मैं साझा करूंगा। एक आंतरिक वर्ग एक वर्ग है जो किसी अन्य वर्ग के भीतर घोंसला है और इसकी कक्षा के तत्कालता का संदर्भ है। उस संदर्भ के माध्यम से यह कक्षाओं के सदस्यों को एक्सेस कर सकता है जैसे कि यह श्रेणी स्वयं ही था। इसलिए यह युक्त वर्ग के उदाहरण के लिए बाध्य है और इस प्रकार स्थिर सदस्य नहीं हो सकते हैं (क्योंकि वे युक्त कक्षा से बंधे नहीं होंगे)।

घोंसला वाले वर्ग को स्थिर वर्ग के रूप में घोषित करने के लिए इसे स्थिर वर्ग के उदाहरण से घोषित करता है, और इसलिए इसके अपने स्थिर चर (और जो भी नियमित कक्षा हो सकती है) हो सकती है। बेशक यह युक्त वर्ग के सदस्यों तक पहुंच नहीं पाएगा।

+0

घोंसला वाले पार्सल योग्य वर्गों का उपयोग करते समय आंतरिक स्थिरता वर्ग को 'स्थैतिक' के रूप में घोषित करने के लिए मेरे लिए काम किया। – Eido95

0

आपकी बार को पार्सलबल नहीं होना चाहिए। आप बस फू फ़ील्ड के साथ बार फ़ील्ड को सहेज सकते हैं और पूरे ऑब्जेक्ट को createFromParcel(Parcel) विधि में पुनर्स्थापित कर सकते हैं।

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

public class Foo implements Parcelable { 
    private int mFooData = 0; 
    private Bar mBar; 

    public Foo() { 
    } 

    protected Foo(Parcel in) { 
     mFooData = in.readInt(); 

     // Reading Bar 
     int barData = in.readInt(); 
     mBar = new Bar(barData); 
    } 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeInt(mFooData); 

     // Writing Bar 
     dest.writeInt(mBar.getBarData()); 
    } 

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

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

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

    public class Bar { 
     private int mBarData = 0; 

     public Bar(int barData) { 
      mBarData = barData; 
     } 

     public int getBarData() { 
      return mBarData; 
     } 

     public void setBarData(int mBarData) { 
      this.mBarData = mBarData; 
     } 
    } 
} 
संबंधित मुद्दे