SharedPreferences.apply()和ANR应用程序

时间:2015-03-20 12:43:55

标签: android android-activity sharedpreferences apply

我曾经使用过SharedPreferences.apply()方法。当经常调用此方法时,它会挂起应用程序。 Commit()方法非常慢,但工作正常。

你可以在我的例子中得到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;
}
}

折叠并展开活动!

1 个答案:

答案 0 :(得分:3)

每隔10毫秒,无限期地,您通过apply()调用分支后台线程,所有这些都将在尝试对相同数据执行I / O时排队。这不会给你带来好结果。

除此之外,我会非常小心地按照你的方式在线程之间共享Editor实例。