スケジュールされたタスクがクエリを実行すると言っても、dbクエリはUIスレッドから実行されているようです(?)。確かに、データベースにアクセスする場所でスタックトレースを出力できます。
new Exception().printStacktrace();
提案されたソリューションに移ります。データベースクエリが遅く、そうでなければUIがフリーズする場合は、適切な設計のように見えます。 UIレイヤーとdbレイヤーの間にイベントシステムを実装できます。おそらく単純なキューベースのアプローチです。
編集:
イベントベースのソリューションを実装する方法を見つけるための最も可能性の高い例があります。
免責事項:私は長年、実際のUIプログラミングを行っていません。
- ユーザーがUIのボタンをクリックします。 UIスレッドは、イベントオブジェクト(DataWantedEvent)をキュー(java.util.Queue)に配置し、ラベルを変更して( "Waiting for data ...")、続行して他のユーザーの操作を待機します。
- dbレイヤースレッドは、キューからイベントを受け取り、データベースにクエリを実行します。結果は、結果オブジェクトの別のキューにポストバックされます。
- UIスレッド(おそらくメインスレッドではない)は、結果キューから結果オブジェクトを取得し、UIを更新します。
結果オブジェクトをUIにポストバックするためのキューは必要ない場合があります。更新メソッドを直接呼び出すことができます。
ユーザーがキャンセルボタンをクリックすると、更新イベント/コールバックが無視されるか、可能であれば、dbクエリがキャンセルされる可能性があります。