我目前正在尝试为我的应用测试第三方服务,并且需要确定每次特定运行时正在进行的每项测试。
由于每次运行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;
}
每次运行测试时都会运行此功能,还是可以在不担心海岸的情况下执行此操作?
如果答案是“耗时的”,那么每次我进行测试以区分每项测试时,你会建议我做什么?
答案 0 :(得分:15)
关于SharedPreferences
。
SharedPreferences缓存,因此磁盘访问加载数据需要一段时间。您可以尝试在测试套件的早期加载SharedPreferences以避免这种惩罚。
要保留您的数据,您应该选择SharedPreferences.Editor.apply()而不是SharedPreferences.Editor.commit(),因为appy是异步的。但是,请阅读有关两者的文档,以了解哪种情况适用于您的情况。
答案 1 :(得分:1)
我注意到,当您第一次使用putInt()
等方法处理特定密钥时,可能会花费大量时间。此外,它应该等同于写入文件的任何其他方式。
答案 2 :(得分: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();
}
}