2

以下に、正常に機能するコードをいくつか示しますが、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ループを実行しているため、サービスの再起動を停止するよりも、ダイアログを同期して表示する方が簡単です(状態データの保存/復元は複雑すぎます)。

4

1 に答える 1

2

作品の代わりにCallable内部を使用する方がうまくいくかどうか試してみてください。その組み合わせは、私が理解している限り、スレッドからの戻り値を提供することを意味します。FutureTaskRunnable

public String getTanFromUser(long accid, String prompt) {
    // make parameters final
    final long accid_int = accid;
    final String prompt_int = prompt;
    Callable<String> tanDialog = new Callable<String>() {
        public String call() throws Exception {
            return getTANWithExecutionStop(TransferFormActivity.this);
        }
    };
    FutureTask<String> task = new FutureTask<String>(tanDialog);
    runOnUiThread(task);
    String result = null;
    try {
        result = task.get();
    }
    catch (InterruptedException e) { /* whatever */ }
    catch (ExecutionException e) { /* whatever */ }
    return result;
}

ACallableはaに似てRunnableいますが、戻り値があります。

AFutureTaskは同期を行い、結果を待ちます。wait()あなたの/に似ていますnotify()。また、に使用できるようにFutureTask実装します。RunnablerunOnUiThread

于 2012-11-01T18:33:16.157 に答える