如何在不阻止UI线程的情况下编辑SharedPreferences?

时间:2016-05-28 12:17:06

标签: android-asynctask editor sharedpreferences block android-handler

我想在SharedPreferences中添加许多值,但这样做会阻止我的UI线程。我尝试在ASyncTask的doInBackground()中使用Handler,但两次尝试都没有用。

以下是方法:

        ....
        Context c = RamadanWidgetConfig.this;
        savedDataSehri = c.getSharedPreferences("Sehri", 0);
        savedDataIftar = c.getSharedPreferences("Iftar", 0);
        boolean sFilled = savedDataSehri.getBoolean("filled", false);
        boolean iFilled = savedDataIftar.getBoolean("filled", false);
        if (!sFilled || !iFilled) {
            fillSharedPreferences();
        } ....

private void fillSharedPreferences() {

    String date[] = {"6/18/2015", "6/19/2015", "6/20/2015", "6/21/2015", "6/22/2015", "6/23/2015", "6/24/2015", "6/25/2015", "6/26/2015", "6/27/2015", "6/28/2015", "6/29/2015", "6/30/2015", "7/1/2015", "7/2/2015", "7/3/2015", "7/4/2015", "7/5/2015", "7/6/2015", "7/7/2015", "7/8/2015", "7/9/2015", "7/10/2015", "7/11/2015", "7/12/2015", "7/13/2015", "7/14/2015", "7/15/2015", "7/16/2015", "7/17/2015"};
    String sehri[] = {"4:13 AM", "4:13 AM", "4:14 AM", "4:14 AM", "4:14 AM", "4:14 AM", "4:15 AM", "4:15 AM", "4:15 AM", "4:15 AM", "4:16 AM", "4:16 AM", "4:17 AM", "4:17 AM", "4:17 AM", "4:18 AM", "4:18 AM", "4:19 AM", "4:19 AM", "4:20 AM", "4:20 AM", "4:21 AM", "4:21 AM", "4:22 AM", "4:22 AM", "4:23 AM", "4:24 AM", "4:24 AM", "4:25 AM", "4:26 AM"};
    String iftar[] = {"7:24 PM", "7:25 PM", "7:25 PM", "7:25 PM", "7:25 PM", "7:25 PM", "7:26 PM", "7:26 PM", "7:26 PM", "7:26 PM", "7:26 PM", "7:26 PM", "7:26 PM", "7:26 PM", "7:26 PM", "7:26 PM", "7:26 PM", "7:26 PM", "7:26 PM", "7:26 PM", "7:26 PM", "7:26 PM", "7:26 PM", "7:26 PM", "7:26 PM", "7:25 PM", "7:25 PM", "7:25 PM", "7:25 PM", "7:24 PM"};

    SharedPreferences.Editor editorSehri = savedDataSehri.edit();
    SharedPreferences.Editor editorIftar = savedDataIftar.edit();

    for (int i = 0; i < date.length; i++) {
        editorSehri.putString(date[i], sehri[i]);
        editorIftar.putString(date[i], iftar[i]);
    }
    editorSehri.putBoolean("filled", true);
    editorIftar.putBoolean("filled", true);
    editorSehri.apply();
    editorIftar.apply();
}

基本上,我在主屏幕上添加一个小部件,在添加它之前,我正在检查是否有数据。如果我没有数据,则会调用此方法。如果没有调用它,那么其他代码会在几毫秒内执行。

编辑:其实我发现问题出在其他地方。在添加小部件以清除SharedPreferences之前,我正在清除应用程序的数据,但后来我发现清除数据还清除了与首次启动应用程序相关的其他内容。该应用程序总是在第一次启动时需要很长时间。也许它正在设置,但我并不完全知道发生了什么。因此,在清除数据然后添加小部件后,该应用程序基本上是第一次启动。这就是它放慢速度的原因,我认为SharedPreferences使它变慢。

现在我需要弄清楚为什么应用程序在首次启动时需要很长时间以及如何避免它。 (飞溅屏幕首先出现在我的脑海中)。

1 个答案:

答案 0 :(得分:0)

不清楚哪个部分负责填充数据。通常,SharedPreferences是线程安全的,但不支持跨多个进程使用。

冷启动(无数据)你如何等待结果?即使您使用线程插入数据,常量检查仍然可以阻止UI。

如果使用大量结构化数据集,请考虑使用SQLite。 要填充数据,您可以使用服务。