在“if condition”返回的函数之前执行“if block”中的语句

时间:2017-09-17 17:58:13

标签: java android android-asynctask

我在Android中编写了以下代码。 “confirmmalert”功能实际上显示一个警告框,并有正负按钮。

但总是“其他”部分正在发挥作用,即使我没有选择任何东西也是如此。

请回复如何使其正常工作。

private void updatestockin()
{
    if(confirmalert())
    {
        Toast t = Toast.makeText(getApplicationContext(), "Success", 
                  Toast.LENGTH_SHORT);
        t.show();
    }
    else
    {
        Toast t = Toast.makeText(getApplicationContext(), "User Rejected", Toast.LENGTH_SHORT);
        t.show();
    }
}

我的confirmalert功能:

public boolean confirmalert(String title,String msg)
{
    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
    alertDialogBuilder.setMessage(msg);
    alertDialogBuilder.setTitle(title);
    alertDialogBuilder.setPositiveButton("Ok",
        new DialogInterface.OnClickListener()
        {
            @Override
            public void onClick(DialogInterface arg0, int arg1)
            {
                flag=true;
            }
        });

    alertDialogBuilder.setNegativeButton("Cancel",
        new DialogInterface.OnClickListener()
        {
            @Override
            public void onClick(DialogInterface arg0, int arg1)
            {
                flag=false;
            }
        });

    AlertDialog alertDialog = alertDialogBuilder.create();
    alertDialog.show();
    return flag;
}

2 个答案:

答案 0 :(得分:2)

confirmmalert()方法立即返回(在屏幕上甚至显示AlertDialog之前),其中标志字段的值如果没有在您的班级中另外设置则为false。这是因为AlertDialog.show()是异步的,否则会阻塞主(ui)线程,并且在调用它之后你将无法再与该应用程序进行交互。

您需要做的是将调用移到 updatestockin()方法之外的 confirmalert(),并从Dialog.OnClickListener()调用updatestockin。

 //call this from where you normally call updatestockin()
 confirmalert();
 //updatestockin(); // comment this call as it will happen after the user clicks one of the AlertDialog buttons

private void updatestockin(boolean flag) {
    if (flag) {
       Toast t = Toast.makeText(getApplicationContext(), "Success", 
                 Toast.LENGTH_SHORT);
       t.show();
   } else {

       Toast t = Toast.makeText(getApplicationContext(), "User Rejected", Toast.LENGTH_SHORT);
       t.show();
   }
}


public boolean confirmalert(String title,String msg)
{

    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
    alertDialogBuilder.setMessage(msg);
    alertDialogBuilder.setTitle(title);
    alertDialogBuilder.setPositiveButton("Ok",
            new DialogInterface.OnClickListener()
            {
                @Override
                public void onClick(DialogInterface arg0, int arg1)
                {
                    updatestockin(true);
                }
            });

    alertDialogBuilder.setNegativeButton("Cancel",
            new DialogInterface.OnClickListener()
            {
                @Override
                public void onClick(DialogInterface arg0, int arg1)
                {
                    updatestockin(false);
                }
            });

    AlertDialog alertDialog = alertDialogBuilder.create();
    alertDialog.show();
    return flag;
}

答案 1 :(得分:1)

我认为存在异步问题。所以也许这个警报在不同的线程中。因此,由于您的标志初始化为false,因此会运行该标志。

因此,使用wait()和notify()可以同步线程 试试这个:

public boolean confirmalert(String title,String msg)
{
    wait();
    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
    alertDialogBuilder.setMessage(msg);
    alertDialogBuilder.setTitle(title);
    alertDialogBuilder.setPositiveButton("Ok",
            new DialogInterface.OnClickListener()
            {
                @Override
                public void onClick(DialogInterface arg0, int arg1)
                {
                    flag=true;
                    notify();
                }
            });

    alertDialogBuilder.setNegativeButton("Cancel",
            new DialogInterface.OnClickListener()
            {
                @Override
                public void onClick(DialogInterface arg0, int arg1)
                {
                    flag=false;
                     notify();
                }
            });

    AlertDialog alertDialog = alertDialogBuilder.create();
    alertDialog.show();
    wait();

    return flag;
}

它应该工作。未经测试。如果可能的话,请阅读等待并通知一点以便正确理解,希望它能带你走正确路径。