Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java “中的声明”;“如果块”;在函数之前执行;如果条件是“;返回_Java_Android_Android Asynctask - Fatal编程技术网

Java “中的声明”;“如果块”;在函数之前执行;如果条件是“;返回

Java “中的声明”;“如果块”;在函数之前执行;如果条件是“;返回,java,android,android-asynctask,Java,Android,Android Asynctask,我用Android编写了下面的代码。“confirmalert”功能实际上显示一个警报框,并具有正按钮和负按钮 但“其他”部分总是有效的,即使我没有选择任何东西 请回复如何使其正常工作 private void updatestockin() { if(confirmalert()) { Toast t = Toast.makeText(getApplicationContext(), "Success", Toast.LEN

我用Android编写了下面的代码。“confirmalert”功能实际上显示一个警报框,并具有正按钮和负按钮

但“其他”部分总是有效的,即使我没有选择任何东西

请回复如何使其正常工作

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;
}
confirmalert()方法立即返回(在AlertDialog显示在屏幕上之前)带有标志字段的值,如果在类中没有其他设置,则该字段为false。这是因为AlertDialog.show()是异步的,否则它将阻止主(ui)线程,并且在调用应用程序后,您将无法再与它交互

您需要做的是将调用移动到confirmalert()方法之外的updatestockin()方法,并从对话框中调用updatestockin.OnClickListener()


我认为存在异步问题。因此,可能这个警报在不同的线程中。因此,由于您的标志初始化为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;
}

它应该会起作用。没有测试。如果可能,请阅读关于等待和通知的内容,以便正确理解,希望它能引导您找到正确的路径。

confirmalert
没有阻塞,因此,如果条件没有参数,则始终会立即返回true您正在调用的函数confirmalert。是调用不同的函数吗?
OnClickListener
是用户单击按钮时运行的代码的放置位置。将要运行的代码移动到相应的
onClick
方法中。@Shuddh,我已经删除了它,这样你们就可以轻松理解代码了。代码实际上正在运行。但问题是,在我在alertbox中选择任何内容之前,else部分就开始工作了。@AKSW我没有理解您的意思。你能解释一下吗?我不是在寻找替代品。我需要让主体部分等到方法完成
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;
}