Java 如何停止处理程序每次显示的相同警报对话框?

Java 如何停止处理程序每次显示的相同警报对话框?,java,android,android-alertdialog,Java,Android,Android Alertdialog,我有一个关于方法的AlertDialog,该方法在处理程序中使用。当处理程序每次运行时,AlertDialog也会一次又一次地加载,如果对话框仍然显示我不想再次加载它,我想显示该对话框一次。为此,我有下面的代码,但不工作 Handler handler = new Handler(); Runnable runnable = new Runnable() { @Override public void run() {

我有一个关于方法的AlertDialog,该方法在处理程序中使用。当处理程序每次运行时,AlertDialog也会一次又一次地加载,如果对话框仍然显示我不想再次加载它,我想显示该对话框一次。为此,我有下面的代码,但不工作

     Handler handler = new Handler();
      Runnable runnable = new Runnable() {
        @Override
          public void run() {
            handler.postDelayed(this, 1000);
            checkCountry();
        }

    };
    handler.postDelayed(runnable, 1000);




public void checkCountry() {

            alertDialogueBuilder = new     AlertDialog.Builder(MainActivity.this);
            alertDialogueBuilder.setTitle("VPN Detected!");
                      alertDialogueBuilder.setMessage("Please Turn Of VPN To Continue!");
   alertDialogueBuilder.setIcon(R.drawable.errorstop);
      alertDialogueBuilder.setCancelable(false);
            alertDialogueBuilder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    finish();
                }
            });
            AlertDialog alertDialog =     alertDialogueBuilder.create();

            if(alertDialog.isShowing()){
             //Do Something
            }else{
             alertDialog.show();
            }
   }
仅创建一次对话框,而不是每次:

private AlertDialog alertDialog;
// ...
initDialog();
Handler handler = new Handler();
  Runnable runnable = new Runnable() {
    @Override
      public void run() {
        handler.postDelayed(this, 1000);
        checkCountry();
    }

};
handler.postDelayed(runnable, 1000);

//...

public void initDialog() {
     alertDialogueBuilder = new     AlertDialog.Builder(MainActivity.this);
     alertDialogueBuilder.setTitle("VPN Detected!");
     alertDialogueBuilder.setMessage("Please Turn Of VPN To Continue!");
     alertDialogueBuilder.setIcon(R.drawable.errorstop);
     alertDialogueBuilder.setCancelable(false);
     alertDialogueBuilder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                finish();
            }
        });
        alertDialog =     alertDialogueBuilder.create();
}

public void checkCountry() {
     if(alertDialog.isShowing()){
     //Do Something
     }else{
         alertDialog.show();
     }
}

若要仅显示一次对话框,请仅调用要从中显示此对话框的checkCountry方法。并且,请删除处理程序代码。这里不需要使用Handler。仅使用checkCountry方法显示对话框。

本书中最古老的技巧是在创建时将布尔字段isAlertDialogShown与假初始化一起设置为true,如果希望在处理程序启动时再次显示,则在onClick中再次将其设置为false

private boolean isShown = false;    
public void checkCountry() { 
            if (isShown){
             //do something
             return;
             }
            isShown = true;
            alertDialogueBuilder = new     AlertDialog.Builder(MainActivity.this);
            alertDialogueBuilder.setTitle("VPN Detected!"); 
                      alertDialogueBuilder.setMessage("Please Turn Of VPN To Continue!"); 
   alertDialogueBuilder.setIcon(R.drawable.errorstop);
      alertDialogueBuilder.setCancelable(false); 
            alertDialogueBuilder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                @Override 
                public void onClick(DialogInterface dialog, int which) {
                    isShown = false;
                    finish();
                } 
            }); 
            AlertDialog alertDialog =     alertDialogueBuilder.create();

             alertDialog.show();
   }
如果您想尝试使用alertDialog,则需要使用您创建的对话框,而不是新对话框,请再次将其另存为字段, 但是,如果处理程序计时器运行过快,并且alertDialog.show不是即时操作,则仍可能存在边缘情况:

AlertDialog alertDialog;
public void checkCountry() { 
            if ( alertDialog != null && alertDialog.isShowing){
                //do something
                return;                     
            }
            alertDialogueBuilder = new     AlertDialog.Builder(MainActivity.this);
            alertDialogueBuilder.setTitle("VPN Detected!"); 
                      alertDialogueBuilder.setMessage("Please Turn Of VPN To Continue!"); 
   alertDialogueBuilder.setIcon(R.drawable.errorstop);
      alertDialogueBuilder.setCancelable(false); 
            alertDialogueBuilder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                @Override 
                public void onClick(DialogInterface dialog, int which) {
                    finish();
                } 
            }); 
            alertDialog =     alertDialogueBuilder.create();

            alertDialog.show();
   } 

请粘贴完整代码。您的代码正在创建一个新的警报对话框,该对话框与任何可能已经显示的警报对话框无关。此代码将不会编译,因为它有键入错误。。请提供正确完整的代码。代码已更新。请检查,但我的国家每10秒更新一次。所以我想使用handler.com,但我的国家每隔10秒就会更新一次。所以我想用handler。对不起,我不明白你的意思。我没有删除您的处理程序代码,我只是将对话框构建内容移动到一个单独的init方法。