我总是想知道大多数应用程序如何创建确认对话框,我可以让我的工作。我知道你无法阻止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;
}
所以我在Thread(而不是UI Thread)中以这种方式使用它:
if(createDialogConfirm()){ ... }
我知道这是一种丑陋的方式,但如果你有任何我想听的人,我也不会知道其他方式。问题是,如果我调用notifyAll()或notify()whitout synchronized(this){}我在我的应用程序上获得强制关闭,但如果我使用它它根本就不会返回,似乎永远不会通知()线程。 想法是从线程返回true或false,但仅当用户按下某个按钮时才会返回。
答案 0 :(得分:0)
您可以使用Interface
通知您的AlertDialog /返回一些值。检查我的回答here
。
答案 1 :(得分:0)
我认为您的问题来自于this
上的同步,这是您拨打notifyAll
时与调用wait
时不同的对象,因为您致电{ {1}}您在notifyAll
对象中。尝试在中性对象上进行同步。此外,您应该使用布尔条件保护new Runnable(...)
以确保不会出现时序竞争或虚假唤醒:
wait