2012-09-24 16 views
17

मैं वर्तमान में अपने ऐप के लिए किसी तृतीय पक्ष सेवा का परीक्षण करने की कोशिश कर रहा हूं, और प्रत्येक विशिष्ट रन पर किए जा रहे प्रत्येक परीक्षण की पहचान करने की आवश्यकता है।साझा किया गया है संपर्क समय समय उपभोग?

चूंकि टेस्ट ऐप चलाने पर हर बार एक से अधिक परीक्षण हो सकते हैं, मुझे हर परीक्षण की पहचान करने की आवश्यकता है।

क्या मैं के उपकरण का नाम और निर्माण (यहाँ कई नहीं उपकरणों), और प्रत्येक परीक्षा के लिए एक सूचकांक के भंडारण है सोचा।

private String getTestId(){ 
    SharedPreferences settings = getPreferences(0); 
    SharedPreferences.Editor editor = settings.edit(); 
    int testNumber = settings.getInt("id", 0); 
    editor.putInt("id", testNumber+1); 
    editor.commit(); 
    String id = Build.DEVICE + Build.VERSION.RELEASE+" - test number: "+testNumber; 
    return id; 
} 

इस समारोह हर बार जब मैं एक परीक्षण में काफ़ी समय से चलाने के चल रहा है, या मैं तट के डर के बिना यह कर सकते हैं?

अगर जवाब "समय लेने" है, तो आप क्या सुझाव है कि मैं हर बार जब मैं आदेश हर परीक्षण अंतर करने के लिए में एक परीक्षण चला सकता हूँ?

+2

परिभाषित करें "समय लेने वाली" - को एक्सेस करना 'SharedPreferences' = तक पहुँचने फाइल सिस्टम जो स्मृति संचालन में सरल से अधिक समय लेता है। – zapl

+0

क्या परीक्षण पर हस्ताक्षर करने का एक बेहतर तरीका है, या परीक्षण को प्रभावित किए बिना हस्ताक्षर करने का यह सबसे अच्छा तरीका है? – thepoosh

उत्तर

12

लगभग SharedPreferences

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

अपने डेटा को बनाए रखने के लिए आपको SharedPreferences.Editor.commit() के बजाय SharedPreferences.Editor.apply() का चयन करना चाहिए क्योंकि ऐप एसिंक्रोनस है। लेकिन कृपया यह देखने के लिए कि आपके मामले में कौन सा लागू होता है, दोनों के बारे में प्रलेखन पढ़ें।

1

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

1

सवाल पहले से ही एक जवाब है, लेकिन में मामला दूसरों आते हैं और एक कोड नमूने के लिए देख रहे हैं, मैं एक साथ SharedPreferences के साथ बातचीत के लिए इस उपयोगिता वर्ग डाल दिया।

कॉलिंग के लिए प्रतिबद्ध(), यदि उपलब्ध लागू() विधि का उपयोग करेगा, अन्यथा यह पुराने उपकरणों पर वापस लागू हो जाएगी प्रतिबद्ध करने के लिए():

public class PreferencesUtil { 

    SharedPreferences prefs; 
    SharedPreferences.Editor prefsEditor; 
    private Context mAppContext; 
    private static PreferencesUtil sInstance; 

    private boolean mUseApply; 

    //Set to private 
    private PreferencesUtil(Context context) { 
     mAppContext = context.getApplicationContext(); 
     prefs = PreferenceManager.getDefaultSharedPreferences(mAppContext); 
     prefsEditor = prefs.edit(); 

     //Indicator whether or not the apply() method is available in the current API Version 
     mUseApply = Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD; 
    } 

    public static PreferencesUtil getInstance(Context context) { 
     if (sInstance == null) { 
      sInstance = new PreferencesUtil(context); 
     } 
     return sInstance; 
    } 

    public boolean getBoolean(String key, boolean defValue) { 
     return prefs.getBoolean(key, defValue); 
    } 

    public int getInt(String key, int defValue) { 
     return prefs.getInt(key, defValue); 
    } 

    public String getString(String key, String defValue) { 
     return prefs.getString(key, defValue); 
    } 

    public String getString(String key) { 
     return prefs.getString(key, ""); 
    } 

    public void putBoolean(String key, boolean value) { 
     prefsEditor.putBoolean(key, value); 
    } 

    public void putInt(String key, int value) { 
     prefsEditor.putInt(key, value); 
    } 

    public void putString(String key, String value) { 
     prefsEditor.putString(key, value); 
    } 

    /** 
    * Sincle API Level 9, apply() has been provided for asynchronous operations. 
    * If not available, fallback to the synchronous commit() 
    */ 
    public void commit() { 
     if (mUseApply) 
      //Since API Level 9, apply() is provided for asynchronous operations 
      prefsEditor.apply(); 
     else 
      //Fallback to syncrhonous if not available 
      prefsEditor.commit(); 
    } 
} 
संबंधित मुद्दे