SharedPreferences.apply() 和 ANR 应用程序
SharedPreferences.apply() and ANR application
我习惯了SharedPreferences.apply()方法。当经常调用此方法时,它会挂起应用程序。 Commit() 方法非常慢,但工作正常。
你可以在我的例子中得到ANR。折叠并展开 activity!
public class Main extends Activity {
@Override
public void onCreate(Bundle b) {
super.onCreate(b);
setContentView(R.layout.main);
new Thread(new Runnable() {
@Override
public void run() {
while(true) {
SharedPreferences.Editor ed = getEditor();
ed.putString(getUUID(), getUUID());
ed.apply();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
public static String getUUID() {
return UUID.randomUUID().toString();
}
final private String BASE = "BASE";
private SharedPreferences shadPrefBase = null;
SharedPreferences getSharedPreferences() {
if(shadPrefBase == null) {
shadPrefBase = getSharedPreferences(BASE, Context.MODE_MULTI_PROCESS);
}
return shadPrefBase;
}
private SharedPreferences.Editor editorShared = null;
private SharedPreferences.Editor getEditor() {
if(editorShared == null) {
editorShared = getSharedPreferences().edit();
}
return editorShared;
}
}
折叠和展开 activity!
每隔 10 毫秒,无限期地,您将通过 apply()
调用分叉一个后台线程,所有这些线程都会在尝试对同一数据执行 I/O 时排队。那不会给你好的结果。
除此之外,我会非常小心地像您一样跨线程共享 Editor
实例。
我习惯了SharedPreferences.apply()方法。当经常调用此方法时,它会挂起应用程序。 Commit() 方法非常慢,但工作正常。
你可以在我的例子中得到ANR。折叠并展开 activity!
public class Main extends Activity {
@Override
public void onCreate(Bundle b) {
super.onCreate(b);
setContentView(R.layout.main);
new Thread(new Runnable() {
@Override
public void run() {
while(true) {
SharedPreferences.Editor ed = getEditor();
ed.putString(getUUID(), getUUID());
ed.apply();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
public static String getUUID() {
return UUID.randomUUID().toString();
}
final private String BASE = "BASE";
private SharedPreferences shadPrefBase = null;
SharedPreferences getSharedPreferences() {
if(shadPrefBase == null) {
shadPrefBase = getSharedPreferences(BASE, Context.MODE_MULTI_PROCESS);
}
return shadPrefBase;
}
private SharedPreferences.Editor editorShared = null;
private SharedPreferences.Editor getEditor() {
if(editorShared == null) {
editorShared = getSharedPreferences().edit();
}
return editorShared;
}
}
折叠和展开 activity!
每隔 10 毫秒,无限期地,您将通过 apply()
调用分叉一个后台线程,所有这些线程都会在尝试对同一数据执行 I/O 时排队。那不会给你好的结果。
除此之外,我会非常小心地像您一样跨线程共享 Editor
实例。