2013-01-17 46 views
10

में writeStringArray() और readStringArray() का उपयोग कैसे करें मैं हाल ही में Androids Parcel कक्षा के अंदर एक बहुत बेवकूफ (कम से कम मेरे दृष्टिकोण से) कार्यान्वयन में आया था।एक पार्सल

मान लीजिए मैं इस

class Foo implements Parcelable{ 

    private String[] bars; 
    //other members 

    public in describeContents(){ 
     return 0; 
    } 

    public void writeToParcel(Parcel dest, int flags){ 

     dest.writeStringArray(bars); 
     //parcel others 
    } 

    private Foo(Parcel source){ 
     source.readStringArray(bars); 
     //unparcel other members 
    } 

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

     public Foo createFromParcel(Parcel source){ 
      return new Foo(source); 
     } 

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

    }; 
} 

की तरह एक साधारण वर्ग अब है, अगर मैं एक Foo वस्तु पार्सल करना चाहते हैं और bars रिक्त है मैं (exept पाठ्यक्रम के अपवाद को पकड़ने के) इस स्थिति से उबरने के लिए कोई रास्ता नहीं देख । अगर मैं bars जो अशक्त हैं पारित

public final void writeStringArray(String[] val) { 
     if (val != null) { 
      int N = val.length; 
      writeInt(N); 
      for (int i=0; i<N; i++) { 
       writeString(val[i]); 
      } 
     } else { 
      writeInt(-1); 
     } 
    } 


    public final void readStringArray(String[] val) { 
     int N = readInt(); 
     if (N == val.length) { 
      for (int i=0; i<N; i++) { 
       val[i] = readString(); 
      } 
     } else { 
      throw new RuntimeException("bad array lengths"); 
     } 
    } 

तो writeStringArray ठीक है: यहाँ पार्सल से इन दोनों तरीकों का कार्यान्वयन है। यह पार्सल में -1 लिखता है। लेकिन विधि पढ़ने के तरीके को कैसे पढ़ा जाता है? अगर मैं अंदर bars पास करता हूं (जो निश्चित रूप से शून्य है) मुझे val.length से एक NullPointerException मिलेगा। अगर मैं कहने से पहले bars बना देता हूं तो मुझे कोई संकेत नहीं मिलता कि यह कितना बड़ा होना चाहिए। यदि आकार अंदर लिखा गया मिलान से मेल नहीं खाता है तो मुझे एक रनटाइम अपवाद प्राप्त होता है।

readStringArray-1 के परिणाम से अवगत नहीं है जो writeStringArray से शून्य वस्तुओं पर लिखा जाता है और केवल लौटाता है?

writeStringArray(String[]) पर कॉल करने से पहले मुझे लगता है कि bars का आकार सहेजना एकमात्र तरीका है जो इस विधि को बेकार बनाता है। यह अनावश्यक रूप से ऐरे के आकार को दोबारा बचाएगा (मुझे याद रखने के लिए एक बार, writeStringArray से दूसरी बार)।

क्या किसी को पता है कि इन दो तरीकों का उपयोग कैसे किया जाना चाहिए, क्योंकि उनके लिए कोई जावा-डॉक नहीं है?

उत्तर

28

आपको अपने मामले में Parcel.createStringArray() का उपयोग करना चाहिए।

मैं Parcel.readStringArray(String[] val) के लिए उचित उपयोग-केस की कल्पना नहीं कर सकता लेकिन इसका उपयोग करने के लिए आपको सरणी के सटीक आकार को जानना होगा और इसे मैन्युअल रूप से आवंटित करना होगा।

+0

धन्यवाद। इन निर्माण * कार्यों को कभी नोटिस न करें। मैं अभी भी इस सवाल को थोड़ा सा खोल दूंगा, ताकि कोई मुझे उस बदसूरत विधि के लिए एक उद्देश्य दे सके। –

4

यह दस्तावेज की कमी (वास्तव में) से वास्तव में स्पष्ट नहीं है लेकिन readStringArray() का उपयोग तब किया जाना चाहिए जब ऑब्जेक्ट पहले से ही जानता है कि इस फ़ंक्शन को कॉल करने से पहले स्ट्रिंग सरणी कैसे बनाएं; उदाहरण के लिए जब यह सांख्यिकीय रूप से instanciated है या इसका आकार किसी अन्य पूर्व पढ़ने मूल्य से जाना जाता है।

इसके बजाय आपको फ़ंक्शन createStringArray() पर कॉल करने की आवश्यकता है।