2012-09-24 5 views
17

私は現在、自分のアプリケーションのサードパーティサービスをテストしようとしており、特定の実行ごとに実行されている各テストを識別する必要があります。はSharedPreferencesのアクセスに時間がかかりますか?

私はtestAppを実行するたびに複数のテストが行​​われることがあるため、すべてのテストを特定する必要があります。

私が考えていたのは、デバイス名とビルド(ここではデバイス数が少ない)と各テストのインデックスを格納していたことです。

テスト時間を費やすたびにこの機能を実行していますか、それとも海岸を恐れることなくこれを行うことができますか?

答えが「時間がかかる」場合は、テストごとに区別するためにテストを実行するたびに何を提案しますか?

+2

「時間がかかる」の定義 - SharedPreferences' =アクセス 'へのアクセス単純なメモリ操作よりも時間がかかるファイルシステムです。 – zapl

+0

には、テストに署名するより良い方法がありますか?これがテストに影響を与えずに署名する最良の方法ですか? – thepoosh

答えて

12

SharedPreferences

最初の読み込み後にSharedPreferencesキャッシュが使用されるため、データを読み込むためのディスクアクセスに時間がかかりますが1回です。 SharedPreferencesをテストスイートの早い段階でロードして、このペナルティを避けることができます。

データを永続化するには、appyが非同期であるため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(); 
    } 
}