2011-01-14 9 views
6

से सरणी प्राप्त करें मेरे पास एक एक्सएमएल फ़ाइल में रेखांश और देशांतर बिंदुओं की एक सूची है जिसका उपयोग पूरे एप्लिकेशन में किया जाता है। मुझे लगता है कि यह अंक अक्सर अंक प्राप्त करने के लिए इस कोड को दोहराता है और लगता है कि एक बेहतर तरीका होना चाहिए? कि सिर्फ एक स्टेशन पाने के लिए हैजावा/एंड्रॉइड xml

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <array name="stations"> 
     <item> 
      <name>Station name</name> 
      <longitude>1111111</longitude> 
      <latitude>11111</latitude> 
      <code>1</code> 
     </item> 

और एक और (संभव) समस्या मैं उन सभी को मिलता है और एक मैं सरणी से चाहते हैं निकालने के लिए:

String[] mTempArray = getResources().getStringArray(R.array.stations); 
    int len = mTempArray.length; 
    mStationArray = new ArrayList<Station>(); 
    for(int i = 0; i < len; i++){ 
     Station s = new Station(); 
     String[] fields = mTempArray[i].split("[\t ]"); 
     s.setValuesFromArray(fields); 
     Log.i("ADD STATION", ""+s); 
     mStationArray.add(s); 
    } 

एक्सएमएल के प्रारूप में है । क्या यह काफी धीमा होने जा रहा है? क्या मैं इस सरणी को पूरे ऐप में सुसंगत बना सकता हूं?

उत्तर

4

मैं MilkJug के रूप में ही सोचा था, स्टेशनों को बनाने के लिए एक उपयोगिता विधि का उपयोग करने के लिए, लेकिन मैं एक अलग दृष्टिकोण प्रदान करना चाहते हैं: Station वर्ग निर्माता में संभव के रूप में निर्माण तर्क के रूप में ज्यादा ले जाएँ। उदाहरण को सरल रखने के लिए, मैं उपयोगिता विधि को Station कक्षा में भी ले जा रहा हूं।

यह एक समग्र क्लीनर डिजाइन प्रदान करता है, स्टेशन वर्ग खुद के बाहर के रूप में, अपने कोड एक स्टेशन वस्तु जिसका निर्माण/प्रारंभ चरणों पूरी तरह से पूरा नहीं किया गया है से निपटने के लिए कभी नहीं करना चाहिए।

(एक डेटाबेस का उपयोग करने के kgiannakakis's सुझाव अगर आप स्टेशन वस्तुओं की एक बहुत कुछ है जाने के लिए एक बेहतर तरीका हो सकता है।)

public class Station { 
    private static List<Station> sStationArray = null; 

    /** 
    * Construct a Station from a specially-encoded String. The String 
    * must have all the necessary values for the Station, separated by tabs. 
    */ 
    public Station(String fieldString) { 
     String[] fields = fieldString.split("[\t ]"); 

     // For safety, setValuesFromArray() should be declared 'final'. 
     // Better yet, you could just move its body into this constructor. 
     setValuesFromArray(fields); 

     // I'm assuming 'mName' is the name field for the Station 
     Log.i("Station", this.mName); 
    } 

    public static Station getStationArray(Context ctx) { 
     if (sStationArray == null) { 

      // (Please don't use the prefix 'm' for non-member variables!) 
      final String[] tempArray = 
       ctx.getResources().getStringArray(R.array.stations); 
      final int len = tempArray.length; 

      // Passing the length into the ArrayList constructor (if it's 
      // known, or can be guessed at) can be a very simple yet 
      // effective optimization. In this case the performance boost 
      // will almost certainly **not** be meaningful, but it's 
      // helpful to be aware of it. 
      sStationArray = new ArrayList<Station>(len);  

      for (int i = 0; i < len; i++) { 
       Station s = new Station(tempArray[i]); 
       sStationArray.add(s); 
      } 
     } 
     return sStationArray; 
    } 
} 
+0

इसके लिए धन्यवाद। क्या इससे कोई फर्क पड़ता है कि मैंने इसे ऐरेलिस्ट में बदल दिया? – Ashley

+0

यह पहले से ही एक ऐरेलिस्ट है - लाइन 'sStationArray = new ArrayList (लेन) देखें; '। आप 'sStationArray' को 'ArrayList ' प्रकार के रूप में बदल सकते हैं, लेकिन इससे कार्यक्षमता या प्रदर्शन में कोई फर्क नहीं पड़ता। –

4

क्यों एक उपयोगिता विधि है कि एक पैरामीटर के रूप में एक संदर्भ लेता है और स्टेशन संसाधनों रिटर्न नहीं बना (लेकिन अलग आशय कार्यप्रणाली रखने)?

public class StatUtil { 
    private static List<Station> mStationArray = null; 

    public static Station getStation(Context ctx) { 
    if (mStationArray == null) { 
     String[] mTempArray = getResources().getStringArray(R.array.stations); 
     int len = mTempArray.length; 
     mStationArray = new ArrayList<Station>(); 
     for(int i = 0; i < len; i++){ 
     Station s = new Station(); 
     String[] fields = mTempArray[i].split("[\t ]"); 
     s.setValuesFromArray(fields); 
     Log.i("ADD STATION", ""+s); 
     mStationArray.add(s); 
     } 
    } 

    return mStationArray; 
    } 
} 

और इसके साथ अपने कोड से कहते हैं: उदाहरण के लिए:

stationArray = StatUtil.getStation(this); 

बार बार स्टेशनों को लाते समय जब तक आप उन्हें एक पाश में फ़ेच कर रहे हैं उन्हें कैशिंग की तुलना में धीमी है, लेकिन नहीं काफी धीमी हो जाएगा। उपरोक्त के रूप में करने से कई प्रतियां प्राप्त होने से रोकेंगी।

+0

'getResources करने के लिए कॉल()' 'ctx उपसर्ग के साथ किया जाना चाहिए। ' –

2

मैं दो समाधान का प्रस्ताव कर सकते हैं:

  1. आप एक सिंगलटन वर्ग है कि एक बार initializes बना सकते हैं, एक्सएमएल से डेटा पढ़ता है और एक सूची या एक मानचित्र में स्टेशनों संग्रहीत करता है। यदि आप अपने नाम के आधार पर स्टेशन को तुरंत ढूंढना चाहते हैं तो मानचित्र का उपयोग करें। सिंगलटन कक्षा सभी स्टेशनों को पुनर्प्राप्त करने या उनमें से केवल एक को हटाने के तरीकों को प्रदान करेगी।
  2. डेटाबेस तालिका बनाएं और वहां जानकारी स्टोर करें। आपको अधिक कोड की आवश्यकता हो सकती है, लेकिन लाभ यह होगा कि आप अधिक उन्नत प्रश्नों को चलाने में सक्षम होंगे।