0

Я хочу добавить много значений в SharedPreferences, но это блокирует мой поток пользовательского интерфейса. Я попытался сделать это в doInBackground() ASyncTask, а также с помощью Handler, но обе попытки оказались бесполезными.Как редактировать SharedPreferences без блокировки темы пользовательского интерфейса?

Вот метод:

 .... 
     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(); 
} 

В принципе, я добавить виджет на главном экране и перед добавлением его я проверяю, если у меня есть данные или нет. Этот метод вызывается, если у меня нет данных. Если это не вызвано, тогда другой код выполняется в миллисекундах.

EDIT: На самом деле я узнал, что проблема лежит где-то в другом месте. Я очистил данные приложения перед добавлением виджета, чтобы очистить SharedPreferences, но позже выяснил, что очищающие данные также очищают что-то еще, что связано с первым запуском приложения. Приложение всегда занимает много времени при запуске в первый раз. Возможно, это настраивает, но я точно не знаю, что происходит. Поэтому после очистки данных, а затем добавления виджета, приложение в основном запускается в первый раз. Вот почему он замедлялся, и я думал, что SharedPreferences замедляет работу.

Теперь мне нужно выяснить, почему приложение занимает так много времени на первом запуске и как его избежать. (Всплывающий экран приходит мне на ум).

ответ

0

Непонятно, какая часть отвечает за заполнение данных. Обычно SharedPreferences является потокобезопасным, но не поддерживает использование нескольких процессов.

С холодным стартом (без данных), как вы ждете результата? Постоянная проверка по-прежнему может блокировать пользовательский интерфейс, даже если вы используете потоки для вставки данных.

Если вы используете огромное количество структурированных данных, рассмотрите возможность использования SQLite. Для заполнения данных вы можете использовать сервис.

+0

Я добавил еще несколько строк кода, чтобы показать, когда и как этот метод вызывается. Я просто проверяю значение из SharedPreferences под названием «заполнено». Если это правда, у меня есть данные. Во всех остальных случаях я предполагаю, что данных нет. – Usman

+0

Как вы пробовали резьбу? Весь ваш код живет в виджетах? –

+0

На самом деле я узнал, что проблема лежит где-то в другом месте. Я очистил данные приложения перед добавлением виджета, чтобы очистить SharedPreferences, но позже выяснил, что очищающие данные также очищают что-то еще, что связано с первым запуском приложения. Приложение всегда занимает много времени при запуске в первый раз. Возможно, это настраивает, но я точно не знаю, что происходит. Поэтому после очистки данных, а затем добавления виджета, приложение в основном запускается в первый раз. Вот почему он замедлялся, и я думал, что SharedPreferences замедляет работу. – Usman

Смежные вопросы