問題タブ [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.

0 投票する
1 に答える
137 参照

android - Android が UI スレッドを一時停止してバックグラウンド スレッドを実行することはありますか?

Android スレッド スケジューラは、他のすべてのユーザー (ワーカー/バックグラウンド) スレッドよりもメイン UI スレッドを優先することが保証されていますか?それとも、ユーザー スレッドがメイン スレッドを中断する可能性がありますか? 私の目標は、Java/Kotlin コードを過度に同期することなく、競合状態を回避することです。

0 投票する
2 に答える
536 参照

java - Android: 別のスレッドが UI を無反応にしていますか?

アクティビティから新しいスレッドを開始しています。このスレッドは 10 秒の操作を実行し、UI に次のように報告します。runOnUiThread()

10 秒間の操作の間、UI が応答しなくなり、ユーザーの操作に応答しなくなります。この場合、ツールバーのボタンを使用してアクティビティを閉じようとしています。ANRエラーがスローされますが、ボタンのクリックはワーカー スレッドの終了後に処理されます。

ProgressBarただし、スレッドが動作している間、UI スレッドで作業が行われている場合には発生しない回転をアプリで表示できます。

は、このProfiler作業中に UI スレッドがスリープしていることを示しています。代わりに使用してみましAsyncTaskたが、それも機能しません。とにかく、ここにいくつかのコードがあります:

Threadウィンドウがフォーカスされると、新しいものが開始されます。

アクティビティ:

スレッド:

viewModel問題と関係があるかどうかはわかりませんviewModel.getAllWords()が、重い 10 秒の Room db 操作を実行するメソッドです。

スリープ状態のUI スレッドとワーカー(AsyncTask #6)Profilerを示すスナップショットを次に示します。Thread

ここに画像の説明を入力

編集:

わかりましたので、問題は部屋の DB 操作にあると思います / viewModel. のコンテンツを置き換えると、getAllWords()ユーザーThread.sleep(10000);の操作のために UI スレッドが解放されるため、(何らかの理由で) ユーザー入力を妨げているのは次のコードです。

編集2:

提案されているように、私は今onPostExecute()、単語を取得するためにインターフェースと共に使用しています:

get()listenerは削除され、コールバックを処理するために渡してタスクを実行するだけです。

これはうまく機能し、単語はアクティビティに正常に返されますが、操作の実行中は UI がまだ応答しません