diff --git a/app/src/main/java/com/example/oplogy/MainActivity.java b/app/src/main/java/com/example/oplogy/MainActivity.java index 241b490..91988a5 100644 --- a/app/src/main/java/com/example/oplogy/MainActivity.java +++ b/app/src/main/java/com/example/oplogy/MainActivity.java @@ -87,12 +87,10 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe Log.d("MainActivity","geocodeAddress"); - //TODO:classIdの初期値を取得 ExecutorService executor = Executors.newSingleThreadExecutor(); executor.execute(() -> { try { - AppDatabase db = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, "SetUpTable") - .build(); + AppDatabase db = getDatabaseInstance(); SetUpTableDao setUpTableDao = db.setUpTableDao(); classId = setUpTableDao.getClassId(); firestoreReception.getDocumentsByClassId(classId); @@ -190,95 +188,83 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe //ルート作成の非同期処理 private void fetchDataAndCreateRoute() { - //非同期処理の開始 ExecutorService executor = Executors.newSingleThreadExecutor(); - CountDownLatch latch = new CountDownLatch(2); - - // タスク1: ローカルDBから生徒数を取得してtotalStudentと比較 executor.execute(() -> { - AppDatabase db = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, "SetUpTable").build(); - SetUpTableDao setUpTableDao = db.setUpTableDao(); - - Log.d("MainActivity", "db" + setUpTableDao.getAll()); - + AppDatabase db = getDatabaseInstance(); SetUpTableDao setUpTableDao = db.setUpTableDao(); int totalStudent = setUpTableDao.getTotalStudent(); int myDataListSize = firestoreReception.getMyDataListSize(); + //総生徒数と提出済みになっている生徒の数が一致するかの確認 runOnUiThread(() -> { if (totalStudent != myDataListSize) { - showRouteCreationDialog(latch); + //未提出者がいることの警告ダイアログ + showRouteCreationDialog(); } else { - latch.countDown(); + //ルート作成 + createRoute(executor); } }); }); - // タスク2: ルート作成を行う + // `fetchDataAndCreateRoute`メソッド内では、shutdownを呼び出さない + } + + private void showRouteCreationDialog() { + new AlertDialog.Builder(MainActivity.this) + .setTitle("警告") + .setMessage("人数が足りてませんがそれでもルート作成を行いますか?") + .setPositiveButton("OK", (dialog, which) -> { + // 新しいExecutorServiceを作成してタスクを実行 + ExecutorService dialogExecutor = Executors.newSingleThreadExecutor(); + createRoute(dialogExecutor); + dialogExecutor.shutdown(); + }) + .setNegativeButton("Cancel", (dialog, which) -> { + dialog.dismiss(); + }) + .show(); + } + + private void createRoute(ExecutorService executor) { executor.execute(() -> { List myDataList = null; while (myDataList == null) { myDataList = firestoreReception.getMyDataList(); try { Thread.sleep(3000); - Log.d("MainActivity", "myDataList" + myDataList.size()); } catch (InterruptedException e) { - throw new RuntimeException(e); + Thread.currentThread().interrupt(); + return; } } - Log.d("MainActivity", "myDataList" + myDataList.size()); + + //final宣言することによって、スレッドセーフになる(ラムダ式内で使えるようにする) + final List finalMyDataList = myDataList; CreateRoot createRoot = new CreateRoot(MainActivity.this); - Boolean notDuplicates = createRoot.receiveData(myDataList,getApplicationContext()); - latch.countDown(); + Boolean notDuplicates = createRoot.receiveData(finalMyDataList, getApplicationContext()); - if (notDuplicates) { - Log.d("MainActivity", "スケジュール作成成功"); - } else { - showErrorDialog(latch, myDataList); - } - }); - - new Thread(() -> { - List myDataList = firestoreReception.getMyDataList(); - try { - latch.await(); // Both tasks must call countDown() before this returns - runOnUiThread(() -> { + runOnUiThread(() -> { + if (notDuplicates) { + Log.d("MainActivity", "スケジュール作成成功"); Intent toRoot = new Intent(MainActivity.this, Maps.class); startActivity(toRoot); - }); - } catch (InterruptedException e) { - e.printStackTrace(); - } - }).start(); + } else { + //保護者の重複による警告ダイアログ + showErrorDialog(finalMyDataList); + } + }); - executor.shutdown(); + // createRouteの最後にexecutorをシャットダウン + executor.shutdown(); + }); } - //ルート作成のダイアログ - private void showRouteCreationDialog(CountDownLatch latch) { - new AlertDialog.Builder(MainActivity.this) - .setTitle("警告") - .setMessage("人数が足りてませんがそれでもルート作成を行いますか?") - .setPositiveButton("OK", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - latch.countDown(); - } - }) - .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - } - }) - .show(); - } - - public void showErrorDialog(CountDownLatch latch, List myDataList) { + private void showErrorDialog(List myDataList) { List studentNumbers = new ArrayList<>(); - for (int i = 0; i < myDataList.size(); i++) { - if (myDataList.get(i).getSchedule() == 0) { - studentNumbers.add(myDataList.get(i).getStudentNumber()); + for (MyDataClass data : myDataList) { + if (data.getSchedule() == 0) { + studentNumbers.add(data.getStudentNumber()); } } StringBuilder message = new StringBuilder("保護者の重複が重大でルート作成ができません。調整してください。\n出席番号: "); @@ -291,15 +277,19 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe new AlertDialog.Builder(MainActivity.this) .setTitle("警告") .setMessage(message.toString()) - .setPositiveButton("OK", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - } + .setPositiveButton("OK", (dialog, which) -> { + dialog.dismiss(); }) .show(); } + + private AppDatabase getDatabaseInstance() { + return Room.databaseBuilder(getApplicationContext(), AppDatabase.class, "SetUpTable").build(); + } + + + //提出状況の取得 private ArrayList getSubmissionStudents() { ArrayList submissionStudents = new ArrayList<>(); @@ -310,7 +300,7 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe executor.execute(() -> { // 1. Roomデータベースから全生徒数を取得 - AppDatabase db = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, "SetUpTable").build(); + AppDatabase db = getDatabaseInstance(); SetUpTableDao setUpTableDao = db.setUpTableDao(); int totalStudent = setUpTableDao.getTotalStudent(); // 2. Firestoreから生徒番号のリストを取得