我總是想知道大多數應用程序如何創建確認對話框,我可以讓我的工作。我知道你不能阻止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(),則會同步(this){}我在應用程序上獲得強制關閉,但是如果我使用它,它永遠不會返回,它似乎從來沒有通知()線程。 這個想法是從線程返回true或false,但只有當用戶按下了一些按鈕。
你爲什麼把事情這麼複雜? 「」我知道你不能阻止UI線程「」但你實際上正在做大部分工作(創建一個對話)在UI線程中,這是線程的主線程。 你在做簡單對話時面臨什麼問題(沒有如此複雜)? –
如果您閱讀了這個問題,您將看到我不想簡單地創建一個對話框,我想等待用戶輸入的對話框,但當然不會阻止UI線程 – Andres