ほとんどのアプリケーションが確認ダイアログをどのように作成するのか、私はいつも疑問に思っていました。UIスレッドをブロックできないことはわかっているので、次のようなものがあります。
private synchronized boolean createDialogConfirm() {
if(DEBUG) Log.i("Dialog", "createDialogConfirm()");
// Creo un nuevo Thread que crea el cuadro de dialogo TODO: no funciona la confirmacion, nunca llega al return
runOnUiThread(new Runnable() {
@Override
public void run() {
// Creo el dialogo con los dos botones
AlertDialog.Builder confirm = new AlertDialog.Builder(LogicAnalizerView.this);
confirm.setTitle("Guardar");
confirm.setMessage("El archivo existe, sobreescribir ?");
if(DEBUG) Log.i("Dialog", "createDialogConfirm() -> Created");
// Boton Si
confirm.setPositiveButton("Si", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
state = true;
synchronized(this) { this.notifyAll(); }; // Despierta el Thread
}
});
// Boton No
confirm.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
state = false;
synchronized(this) { this.notifyAll(); };
dialog.dismiss();
}
});
confirm.show();
}
});
if(DEBUG) Log.i("Dialog", "createDialogConfirm() - Thread created");
try {
synchronized(this) { wait(); }; // Queda esperando (no retorna nada) hasta que se llame a notify() en algun boton
} catch (InterruptedException e) {
e.printStackTrace();
}
return state;
}
したがって、スレッド内でこのように使用します(UIスレッドではありません):
if(createDialogConfirm()){ ... }
私はそれが醜い方法であることを知っていますが、他の方法を知りません. 問題は、notifyAll() または notify() を Synchronized(this){} なしで呼び出すと、アプリで Force Close が発生することですが、それを使用すると、単に返されないため、Thread を notify() しないように見えます。アイデアは、ユーザーが何らかのボタンを押した場合にのみ、スレッドから true または false を返すことです。