私はjavaとandroidを初めて使っています。 メインUIスレッドのサービスで次の機能を実行しています。UIスレッドをブロックしないようにループを書く方法は?
public void startSession() {
Log.d(TAG, "startSession()");
sessionStartRequestCompleted = false;
int c =0;
do {
Log.d(TAG, "startSession() - Tyring again #" + c);
writeCharacteristic(
characteristicMap.get(ShsServiceConstants.SH_GATT_SVC_SESSION_TOGGLER_CHARACTERISTIC_UUID),
ShsServiceConstants.SESSION_TOGGLER_CHAR_SESSION_START_OPCODE);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
int timeout = 0;
sessionStartStatus = false;
checkSessionStatus();
while (!sessionStartStatus && timeout < 10) {
timeout++;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (timeout >= 10) {
Log.d(TAG, "StatusCheckTask Timed Out waiting for result");
//fireNextShsGattRequest();
}
c++;
} while (!sessionStartRequestCompleted);
}
しかし、この関数を呼び出すとUIスレッドがブロックされます。どのように私はUIスレッドをブロックしないようにこの関数を書くことができますが、フラグのチェックを行います。
フラグはonCharacteristicRead内で設定されています。
AsyncTaskを使用するか、コード内で新しいスレッド()を作成してください –
[Androidデベロッパー](https://developer.android.com/training/index.html)のウェブサイトは、[偉大な記事](https://developer.android。 com/guide/components/processes-and-threads.html#WorkerThrea ds)を実行する方法について説明します。 Sidenote:なぜ "Thread.sleep"と呼ぶのかを書かなければなりません。 – Fildor
ユーザーが目にする可能性があるUIスレッドで長時間実行されるコードがある場合(UIは応答しない、「ロックアップ」)、唯一の答えは、(a)コードを高速化する(b)**そのワークロードを別のスレッドに移動する**。作業を別のスレッドに移すさまざまな方法がありますが、そのうちのいくつかは以下の回答で説明しています。 –