以下に、正常に機能するコードをいくつか示しますが、1回だけです。runOnUIThreadが終了するまでブロックすることがサポートされています。そして、それは、それが最初に呼び出されたときに実行されるときに実行されます。ただし、2回目に呼び出されると、最後まで実行され、runOnUIThreadの実行が開始されます。メトスが最初に実行された後、それを調整したスレッドはまだロックを保持しており、2回目にメソッドを呼び出すと実行される可能性があります。これは正しいですか?そして、それを修正するために何ができますか?それとも、発信者が最初にロックを取得する2回目のタイミングの問題ですか?
static Integer syn = 0;
@Override
public String getTanFromUser(long accid, String prompt) {
// make parameters final
final long accid_int = accid;
final String prompt_int = prompt;
Runnable tanDialog = new Runnable() {
public void run() {
synchronized(syn) {
tanInputData = getTANWithExecutionStop(TransferFormActivity.this);
syn.notify() ;
}
}
};
synchronized(syn) {
runOnUiThread(tanDialog);
try {syn.wait();}
catch (InterruptedException e) {}
}
return tanInputData;
}
背景:このメソッドを呼び出すスレッドは、バックグラウンドで銀行とトランザクションを実行しているバインドされたサービス内の非同期タスクです。不規則な間隔で、銀行はユーザー確認の要求(キャプチャ、制御の質問、PINの要求など)を送信し、サービスはフォアグラウンドのアクティビティへの弱い参照のコールバックに対していくつかのダイアログを表示する必要があります。サービスはいくつかのネストされたwhileループを実行しているため、サービスの再起動を停止するよりも、ダイアログを同期して表示する方が簡単です(状態データの保存/復元は複雑すぎます)。