20

我目前正在尝试为我的应用程序测试第三方服务,并且需要识别在每次特定运行时正在进行的每个测试。

由于每次运行 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;
}

每次运行测试时都运行此功能是否耗时,或者我可以这样做而不用担心海岸?

如果答案是“耗时”,你会建议我每次运行测试时做什么以区分每个测试?

4

3 回答 3

16

关于SharedPreferences.

SharedPreferences 在首次加载后缓存,因此加载数据的磁盘访问将花费时间但一次。您可以尝试在测试套件的早期加载 SharedPreferences 以避免这种损失。

为了持久化您的数据,您应该选择SharedPreferences.Editor.apply()而不是SharedPreferences.Editor.commit()因为 appy 是异步的。但请务必阅读有关两者的文档,以查看哪一个适用于您的情况。

于 2012-09-26T07:32:03.153 回答
1

这个问题已经有了答案,但如果其他人来并正在寻找代码示例,我将这个实用程序类放在一起用于与 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();
    }
}
于 2013-02-14T04:57:27.707 回答
1

我注意到,当您putInt()对特定键使用第一次这样的方法时,可能会花费大量时间。此外,它应该等同于任何其他写入文件的方式。

于 2012-09-24T19:53:19.950 回答