0

SharedPreferencesに多くの値を入れたいのですが、そうすることでUIスレッドがブロックされてしまいます。私はASyncTaskのdoInBackground()とHandlerを使ってそれをしようとしましたが、どちらの試みも役に立たないことが判明しました。UIスレッドをブロックせずに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(); 
} 

は基本的に、私はホーム画面にウィジェットを追加していると私はデータを持っているか、いない場合は、それを追加する前に私がチェックしています:

は、ここでの方法です。このメソッドは、データがない場合に呼び出されます。これが呼び出されなければ、他のコードはミリ秒以内に実行されます。

編集:実際には、問題はどこかにあることがわかりました。私はSharedPreferencesをクリアするためにウィジェットを追加する前にappのデータをクリアしていましたが、クリアデータがアプリの最初の起動に関連する何かをクリアしていることがわかりました。アプリは初めて起動するときには常に時間がかかります。おそらくそれは物事を設定していますが、私は何が起こっているのか正確には分かりません。だから、データを消去してからウィジェットを追加した後、アプリは本質的に初めて起動しました。これが減速していたため、SharedPreferencesが遅くなっていると思ったのです。

今、最初の起動時にアプリが長くかかる理由と回避方法を理解する必要があります。 (スプラッシュ画面が最初に私の心に来る)。

答えて

0

データを入力する部分がどの部分であるかはっきりしません。一般的にSharedPreferencesはスレッドセーフですが、複数のプロセスでの使用はサポートしていません。

コールドスタート(データなし)ではどのように結果を待つのですか?スレッドを使用してデータを挿入した場合でも、定数チェックはUIをブロックできます。

大量の構造化データセットを使用する場合は、SQLiteを使用することを検討してください。 サービスを利用できるデータを入力する。

+0

このメソッドがいつ、どのように呼び出されるかを示すコードを追加しました。私は単にSharedPreferencesから "filled"という値をチェックします。それが真実なら、私はそのデータを持っています。それ以外の場合は、データがないと仮定します。 – Usman

+0

スレッドをどうやって試しましたか?あなたのコードはすべてウィジェットにありますか? –

+0

実際、私はその問題がどこか他のところにあることを知りました。私はSharedPreferencesをクリアするためにウィジェットを追加する前にappのデータをクリアしていましたが、クリアデータがアプリの最初の起動に関連する何かをクリアしていることがわかりました。アプリは初めて起動するときには常に時間がかかります。おそらくそれは物事を設定していますが、私は何が起こっているのか正確には分かりません。だから、データを消去してからウィジェットを追加した後、アプリは本質的に初めて起動した。これが減速していたため、SharedPreferencesが遅くなっていると思ったのです。 – Usman

関連する問題