問題タブ [android-threading]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
android - Room DB からアイテムの数を返す
外部キーによって子が関連付けられている場合、Room DB から親が削除されないようにしようとしています。
私は学位トラッカーに取り組んでいます。タームのコースがある場合、タームは削除できません。タームにコースがない場合は、タームを削除できます。関連する用語 ID を使用してコースの数を取得しようとしています。単純な if ステートメントを使用して、コースがない場合は用語を削除し、用語のコースがある場合はポップアップ アラートを使用し、ユーザーにコースを削除するように指示します。用語を削除する前に。
TermEditorActivity.java から
ViewModel から:
AppRepository から (ここで問題が発生すると思います):
TermDAO から:
これにより、実行時エラーが発生し、削除ボタンが押されるとクラッシュします。概念は単純です。用語の ID を使用してコース DB にクエリを実行し、用語 ID の外部キーを使用してコースの数を取得します。用語がない場合は、用語を削除して用語のリストに戻ります。コースがある場合 (カウント > 0)、ユーザーに警告し、削除せずに終了します。
スレッドなしの例外:
スレッドを使用すると、コースの有無にかかわらず用語が削除され、用語にコースが関連付けられている場合はアラートが表示されません。デバッグ モードで実行すると、コースが 1 つの場合に coursecount が 0 を返すため、クエリが正しく実行されません。
スレッドから値を取得するために必要なことはありますか?
RESTRICT制約に対して SQLiteConstraintException がスローされたときのランタイム エラーのクラッシュ ログを次に示します。例外を使用してもキャッチされていません。
android - 実行中に Android WorkManager が一意のタスクを再送信する
バックグラウンドで長時間実行される画像処理を実行する必要があるAndroidアプリがあります(その多くのチャンクを処理します)
- WorkManager を使用してタスクを実行しました
- ユーザー通知を使用して進行状況を通知します
バージョン
- API レベル 28
- オレオを実行している電話
androidx.work:work-runtime:2.1.0
WorkManager は次のようにセットアップされます (簡略化されたコード)
作品自体は以下のパラメータで提出されます
上記WORK_NAME
のコードに固有であるため、2 つのタスクが同時に実行されることはないと予想されます (ExistingWorkPolicy.REPLACE
同じ問題で試したことに注意してください) 。
ジョブが正しく開始され、通知の進行状況が更新され始めます。しばらくすると、前のタスクがまだ実行されている状態で、タスクが再び開始されたようです。now
これは、2 つの状態 (通知年齢と前の年齢の間、および 0% と前の進行状況の間の進行状況) の間で切り替わる固有の通知からわかります。同じ通知を更新する 2 つのタスクが明らかになりました。一意の通知 ID ではなくランダムな通知 ID を設定することでこれを確認したところ、2 つの通知が表示され、それぞれが独自の生活を送っています。
私は疑問に思う
- 前のタスクがまだ実行中で、アプリから何も要求していないのに、WorkManager がこのタスクを再度送信するのはなぜですか?
- 1つだけを送信した場合、同時に2つのジョブが実行されるのはどうすればよいですか
enqueueUniqueWork