Android SharedReferences.apply()和ANR应用程序
我过去常使用sharedReferences.apply()方法。如果经常调用此方法,则会挂起应用程序。Commit()方法非常慢,但工作正常Android SharedReferences.apply()和ANR应用程序,android,android-activity,sharedpreferences,apply,Android,Android Activity,Sharedpreferences,Apply,我过去常使用sharedReferences.apply()方法。如果经常调用此方法,则会挂起应用程序。Commit()方法非常慢,但工作正常 你可以在我的例子中得到ANR。折叠并展开活动 public class Main extends Activity { @Override public void onCreate(Bundle b) { super.onCreate(b); setContentView(R.layout.main); new Thread(
你可以在我的例子中得到ANR。折叠并展开活动
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;
}
}
折叠并展开活动 每隔10毫秒,您将通过
apply()
调用无限期地分叉一个后台线程,所有这些线程都将在尝试对同一数据执行I/O时排队。这不会给你带来好的结果
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;
}
}
除此之外,我会非常小心地按照您的方式跨线程共享
Editor
实例。每隔10毫秒,您将通过apply()
调用无限期地分叉一个后台线程,所有这些线程都将在尝试对相同数据执行I/O时排队。这不会给你带来好的结果
除此之外,我会非常小心地按照您的方式跨线程共享
Editor
实例。折叠并展开活动!您不认为在多线程环境中,当您获得不同的编辑器实例时,您将面临手工操作的问题,但在内部,它将在共享首选项的相同副本上工作。这可能会导致与同步相关的问题。由于使用了新编辑器,问题无法解决。请折叠并展开活动!您不认为在多线程环境中,当您获得不同的编辑器实例时,您将面临手工操作的问题,但在内部,它将在共享首选项的相同副本上工作。这可能会导致与同步相关的问题。由于使用了新编辑器,问题没有得到解决。您能详细解释一下吗?@Evgeniy:不太可能<代码>应用()分叉线程。您正在移动设备上每秒创建100个线程。无论这些线程做什么,这都不会很好地工作,而且当它们都在争夺同一资源时,情况会更糟。此外,在本例中,您不需要apply()
,因为您已经在后台线程上完成了工作apply()
用于从主应用程序线程保存首选项时(例如,响应UI事件)。@Evgeniy:停止尝试每秒保存SharedReferences
100次。我必须保留3000个或更多对象。提交需要很长时间。在我的示例中,10毫秒内只需暂停一次。但在实际情况下,是经过评估,然后保存的。如果出现中断,则我将丢失数据,因此您需要在每次操作后保存。@Evgeny:“我必须保留3000个或更多对象”-SharedReferences
不是为此而设计的。使用SQLite。“如果出现中断,那么我将丢失数据”--然后在内存中批处理数据并将其写入磁盘的频率降低,例如每秒一次,并在与生成数据的线程分开的线程中执行。你能更详细地解释一下吗?@Evgeniy:不太可能<代码>应用()分叉线程。您正在移动设备上每秒创建100个线程。无论这些线程做什么,这都不会很好地工作,而且当它们都在争夺同一资源时,情况会更糟。此外,在本例中,您不需要apply()
,因为您已经在后台线程上完成了工作apply()
用于从主应用程序线程保存首选项时(例如,响应UI事件)。@Evgeniy:停止尝试每秒保存SharedReferences
100次。我必须保留3000个或更多对象。提交需要很长时间。在我的示例中,10毫秒内只需暂停一次。但在实际情况下,是经过评估,然后保存的。如果出现中断,则我将丢失数据,因此您需要在每次操作后保存。@Evgeny:“我必须保留3000个或更多对象”-SharedReferences
不是为此而设计的。使用SQLite。“如果出现中断,那么我将丢失数据”--然后在内存中批处理数据并将其写入磁盘的频率降低,例如每秒一次,并在生成数据的线程之外的单独线程中执行此操作。