为什么这不会通知线程?

时间:2012-07-03 04:50:17

标签: java android multithreading notify

我总是想知道大多数应用程序如何创建确认对话框,我可以让我的工作。我知道你无法阻止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,但仅当用户按下某个按钮时才会返回。

2 个答案:

答案 0 :(得分:0)

您可以使用Interface通知您的AlertDialog /返回一些值。检查我的回答here

答案 1 :(得分:0)

我认为您的问题来自于this上的同步,这是您拨打notifyAll时与调用wait时不同的对象,因为您致电{ {1}}您在notifyAll对象中。尝试在中性对象上进行同步。此外,您应该使用布尔条件保护new Runnable(...)以确保不会出现时序竞争或虚假唤醒:

wait