Подтвердить что ты не робот

Время доступа SharedPreferences?

В настоящее время я пытаюсь протестировать стороннюю службу для своего приложения и должен идентифицировать каждый тест, который выполняется в каждом конкретном прогоне.

Поскольку при каждом запуске testApp может выполняться более одного теста, мне нужно идентифицировать каждый тест.

То, о чем я думал, это сохранение имени и сборки устройства (не так много устройств здесь) и индекса для каждого теста.

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

Выполняет эту функцию каждый раз, когда я запускаю тестовое время, или могу ли я это сделать, не опасаясь побережья?

если ответ "занимает много времени", что бы вы предложили мне делать каждый раз, когда я запускаю тест, чтобы различать каждый тест?

4b9b3361

Ответ 1

О SharedPreferences.

SharedPreferences кэши после первой загрузки, поэтому доступ к диску для загрузки данных займет время, но один раз. Вы можете попытаться загрузить SharedPreferences в начале набора тестов, чтобы избежать этого штрафа.

Для сохранения ваших данных вы должны выбрать SharedPreferences.Editor.apply() вместо SharedPreferences.Editor.commit( ), поскольку appy является асинхронным. Но, пожалуйста, прочитайте документацию обо всех, чтобы узнать, какой из них применим в вашем случае.

Ответ 2

Я заметил, что когда вы используете методы типа putInt() в первый раз для определенного ключа, это может занять значительное количество времени. Кроме того, он должен быть эквивалентен любым другим способам записи в файл.

Ответ 3

У вопроса уже есть ответ, но в случае, если другие приходят и ищут образец кода, я собрал этот класс утилиты для взаимодействия с SharedPreferences.

Вызов commit() будет использовать метод apply(), если он доступен, иначе он будет возвращен по умолчанию на commit() на более старых устройствах:

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