前提・実現したいこと
Android Studio 4.0
使用言語:Java
非同期処理で値を取得し、その値をメインスレッドの変数で受け取った後処理を行いたいと考えています。これを実現するにはどうすればよいでしょうか。
どなたかお詳しい方、ご教授頂けると幸いです。
実現したい処理の具体例
スマホの戻るボタンを押した際に、データベースから主キーを元に文字列を取り出し、取り出した文字列が予め存在する文字列と同じならばアラートダイアログを出力、そうでなければアクティビティを終了するという処理を行いたいです。非同期処理にしたい部分はデータベースから文字列を取得する際の処理です。以下にプログラムの例を示します。
Java
1@Override 2 public void onBackPressed() { 3 4 String string = "あああああ"; 5 6 //id = 取り出す文字列に対応する主キー 7 int id = 0; 8 9 /*************ここを非同期処理で行う**********************/ 10 11 //idに対応する文字列をデータベースから取得する処理 12 String stringFromRoom = mWordViewModel.getString(id); 13 14 /*******************************************************/ 15 16 17 if (stringFromRoom.equals(string)) { 18 19 AlertDialog.Builder builder = new AlertDialog.Builder(EditMyRouletteActivity.this); 20 builder.setMessage("アラートダイアログ") 21 .setPositiveButton("はい", new DialogInterface.OnClickListener() { 22 public void onClick(DialogInterface dialog, int id) { 23 } 24 }) 25 .setNegativeButton("いいえ", new DialogInterface.OnClickListener() { 26 public void onClick(DialogInterface dialog, int id) { 27 } 28 }) 29 .setOnCancelListener(new DialogInterface.OnCancelListener() { 30 @Override 31 public void onCancel(DialogInterface dialog) { 32 } 33 }) 34 .create() 35 .show(); 36 } else { 37 //アクティビティを終了する 38 Activity.this.finish(); 39 } 40 41 }
なぜ非同期処理をするのか
上記のプログラムの非同期処理にしたい部分を、非同期処理にせず実行した所、以下のエラーが出ました。
java.lang.IllegalStateException: Cannot access database on the main thread since it may potentially lock the UI for a long period of time.
このエラーについて調べた所、
https://stackoverflow.com/questions/59607324/error-cannot-access-database-on-the-main-thread-since-it-may-potentially-lock-t
にて、データベースにアクセスする処理は時間がかかり、メインスレッドを止めてしまうことになるため、別スレッドで実行する必要がある。とのことでした。そのため、データベースから文字列を取得するこの処理を非同期にする必要があるという考えに至りました。
回答1件
あなたの回答
tips
プレビュー