Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/200.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android SharedReferences.apply()和ANR应用程序_Android_Android Activity_Sharedpreferences_Apply - Fatal编程技术网

Android SharedReferences.apply()和ANR应用程序

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(

我过去常使用sharedReferences.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;
}
}

折叠并展开活动

每隔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。“如果出现中断,那么我将丢失数据”--然后在内存中批处理数据并将其写入磁盘的频率降低,例如每秒一次,并在生成数据的线程之外的单独线程中执行此操作。