2016-09-01 4 views
0

Я хочу, чтобы мое предупреждение появлялось в течение 15 минут, когда пользователь нажимал кнопку 5 раз. Пожалуйста, помогите мне. Я не могу понять обработчик в Android.Показать предупреждение в течение 15 минут в android на кнопке

if(btn_count==5){ 
          handler = new Handler(); 
         Timer timer = new Timer(); 
         TimerTask task = new TimerTask() { 
          @Override 
          public void run() { 
           handler.post(new Runnable() { 
            public void run() { 
             try { 
              alert("Your account has been blocked for 15 minutes due to 5 unsuccessfull attempts."); 
              btn_count=0; 
             } catch (Exception e) { 
              // error, do something 
             } 
            } 
           }); 
          } 
         }; 

         timer.schedule(task, 0, 60*1000); 
+2

Просто не угодили – Stefan

+0

поставить предупреждения код здесь –

+1

Этот метод временно отключить вход можно легко обойти с помощью перезапуска приложения, использовать общие предпочтения для отслеживания учетов входа в систему. Проверьте http://stackoverflow.com/questions/20606738/temporarily-disable-login-after-failed-attempts – RamithDR

ответ

0

попытка поставить это в встревоженной диалоговом методе

Шаг 1: изменить

if(btn_count==5){ 
    alert("Your account has been blocked for 15 minutes due to 5 unsuccessfull attempts."); 
} 

Шаг 2: Положите это в встревоженной код

btn_count= 0; 
new Handler().postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        dismiss(); 
       } 
      }, 900000); 
+0

Эй, это работает .. и что, если я хочу условие для более чем 5 неправильных попыток входа в систему для пароля, чем показывать одно и то же предупреждение за 15 минут .. – Shivangi

+0

поместить другую переменную и увеличивает это на onclick кнопки входа в систему, если это неправильно, и если значение == 5, чем отображение диалогового окна таким же образом –

+0

Но я должен остановить пользователя от входа в систему, если неправильные попытки более чем в 5 раз – Shivangi

0

Попробуйте это

new Handler().postDelayed(() -> { 
//Show the Alert here 
}, 90000); 
0
if(btn_count==5){ 


    final Dialog dialog = new Dialog(this); 
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 
    dialog.setContentView(R.layout.loader); 
    dialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT)); 
    dialog.setCancelable(false); 
    dialog.setCanceledOnTouchOutside(false); 
    dialog.show(); 


    new CountDownTimer(900000, 1000) { 

     public void onTick(long millisUntilFinished) { 

     } 

     public void onFinish() { 

      dialog.dismiss(); 

     } 

    }.start(); 


} 
0

Во-первых, не используйте Handler внутри Timer использовать только Handler, которые лучше.

Есть одна переменная, которая хранит щелкает

private int clickCount = 0;

и onClick() вашей кнопки сделать как этот

@Override 
public void onClick(View view){ 

    if(v == btn_login && clickCount < 5){ 
     if(WrongPassword){ 
      clickCount++; 
      if(clickCount == 5){ 
       showAlert(); 
      } 
     }else{ 
      clickCount = 0; 
     // put your login code here 
     } 
    } 

} 

private long mLastClickTime = 0 
private void showAlert(){ 
    mLastClickTime = SystemClock.elapsedRealtime(); 
    alert("Your account has been blocked for 15 minutes due to 5 unsuccessfull attempts."); 
    SharedPreferences.Editor editor = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE).edit(); 
    editor.putLong("mLastClickTime", mLastClickTime); 
    editor.commit(); 
    new Handler().postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       dismiss(); 
       clickCount = 0; 
      } 
     }, 900000); 
} 

и, наконец, в onCreate() вам нужно проверить, что ранее пользователь попробовал более 5 раз или нет (в случае, если пользователь убивает приложение, немедленно возвращается)

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    SharedPreferences prefs = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE); 
    Long oldLastClick = prefs.getLong("mLastClickTime", 0); 
    if (oldLastClick != 0) { 
     Long currentTime = SystemClock.elapsedRealtime(); 
     if((currentTime < oldLastClick) < 90000){ 
      clickCount = 5; 
      alert("Your account has been blocked for 15 minutes due to 5 unsuccessfull attempts."); 

      new Handler().postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        dismiss(); 
        clickCount = 0; 
       } 
      }, (currentTime - oldLastClick)); 

      return; 


     } 
    } 

} 
+0

Thanx для ответа. – Shivangi

0

@Shivangi, я считаю, что CountDownTimer наилучшим образом соответствует вашему требованию, потому что вы также можете обновлять поток пользовательского интерфейса.

Вы можете добиться этого в следующем виде:

Установите счетчик, так что вы можете иметь кнопку подсчет кликов.

if(btnClickCount == 5) 
{ 
    //Show alert to user 
    Toast.makeText(getBaseContext(), "You account locked for next 15 min.", Toast.LENGTH_SHORT).show(); 

    //Pretended that you have login button like this. 
    //Disable login button so that user will not click this until it enabled again after so called 15 minute 
    btnLogin.setEnabled(false); 

    //Start count down timer from 15 minute like this 
    CountDownTimer countDownTimer = new CountDownTimer(900000, 1000) { 
     @Override 
     public void onTick(long millisUntilFinished) 
     { 
      //You can update your UI here if you want,like time remaining for re-login attempt. So that user UX appear good. It'll be called every second as I set it to 1000. 
      // You can user a dialog to show time remaining to unlock account and use this method to get formatted time 
      String hms = String.format("%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(millisUntilFinished), 
        TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millisUntilFinished)), 
        TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished))); 
      //Output will be like this 00:14:59 
     } 

     @Override 
     public void onFinish() 
     { 
      //Enable button as 15 minute lock period is over. and reset the button click counter 
      btnClickCount = 0; 
      btnLogin.setEnabled(true); 
     } 
    }.start(); 

} 

Вы также можете сломать этот код в функции.

Благодаря