我一直想知道大多数应用程序如何创建确认对话框,我可以让我的工作。我知道你不能阻止 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() whitout synchronized(this){},我会在我的应用程序上强制关闭,但如果我使用它,它就永远不会返回,似乎永远不会 notify() 线程。这个想法是从线程返回一个真或假,但只有当用户按下某个按钮时。