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