2012-09-24 34 views
17

Actualmente estoy intentando probar un servicio de terceros para mi aplicación, y necesito identificar cada prueba que se realiza en cada ejecución específica.¿El acceso a SharedPreferences consume mucho tiempo?

Como puedo realizar más de una prueba cada vez que ejecuto TestApp, necesito identificar cada prueba.

Lo que pensé, es almacenar el nombre del dispositivo y la compilación (no hay muchos dispositivos aquí), y un índice para cada prueba.

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; 
} 

está en ejecución Esta función cada vez que ejecute un tiempo de prueba de consumir, o puede hacerlo sin temor a la costa I?

si la respuesta es "lenta", ¿qué me sugeriría que haga cada vez que ejecute una prueba para diferenciar cada prueba?

+2

definen "tiempo" - Acceso 'SharedPreferences' = acceder el sistema de archivos que toma más tiempo que simple en operaciones de memoria. – zapl

+0

¿hay alguna forma mejor de firmar una prueba o esta es la mejor forma de firmar sin afectar la prueba? – thepoosh

Respuesta

12

Acerca de SharedPreferences.

SharedPreferences carece de memoria caché después de la primera carga, por lo que el acceso al disco para cargar datos tomará tiempo una sola vez. Puede intentar cargar SharedPreferences al principio de su conjunto de pruebas para evitar esta penalización.

Para conservar sus datos, debe optar por SharedPreferences.Editor.apply() en lugar de SharedPreferences.Editor.commit() ya que appy es asincrónico. Pero, por favor, lea la documentación sobre ambos para ver cuál aplica en su caso.

1

Me he dado cuenta de que cuando utiliza métodos como putInt() la primera vez para una clave específica puede llevar una cantidad significativa de tiempo. Además, debería ser equivalente a cualquier otra forma de escribir en un archivo.

1

La pregunta ya tiene una respuesta, pero en caso de que otros vengan y estén buscando una muestra de código, armé esta clase de utilidad para interactuar con SharedPreferences.

Calling commit() utilizará el método de aplicación() si está disponible, de lo contrario, volverá por defecto a cometer() en los dispositivos más antiguos:

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(); 
    } 
} 
Cuestiones relacionadas