2015-05-06 1 views
1

Моя цель:Toast «Нажмите снова, чтобы закрыть» дает ошибку при нажатии назад слишком часто

Когда посетитель возвращается к первой странице моего приложения, тост появляется, чтобы посетитель знал, что он снова нажмите кнопку «Назад» в течение 3 секунд, чтобы закрыть приложение для Android.

Конкретная проблема:

Когда вы вернулись на первую страницу и тосты появляется, код работает прекрасно, когда вы нажимаете назад только один раз, но когда появляется тост и нажимается назад больше, чем один раз, появляется следующее сообщение об ошибке: «(имя приложения) остановлено».

Кто-нибудь знает, что вызывает это сообщение об ошибке, и как я могу это решить?

MainActivity.java файл:

// Open previous opened link from history on webview when back button pressed 

private Boolean exit = false; 
@Override 
// Detect when the back button is pressed 
public void onBackPressed() { 
    if(webView.canGoBack()) { 
     webView.goBack(); 
    } 
    else { 
     if (exit) 
      this.finish(); 
     else { 
      Toast.makeText(this, "Press again to exit.", 
       Toast.LENGTH_SHORT).show(); 
       exit = true; 
       new Handler().postDelayed(new Runnable() { 
        @Override 
        public void run() { 
         exit = false; 
        } 
       }, 3 * 1000); 
     }  

    } 
} 
+2

Измените свой вопрос, чтобы включить трассировку стека, иначе мы должны угадать. – Simon

+0

Попробуйте инициализировать ваш обработчик с помощью 'new Handler (Looper.getMainLooper())' – EpicPandaForce

ответ

2

Это выглядит, когда вы быстро нажмите кнопку назад, он звонит this.finish() несколько раз, в результате аварии.

Вы можете сделать две вещи, чтобы предотвратить это. Во-первых, установите флаг exit в значение false после вызова this.finish().

Кроме того, для предотвращения гонки-состояния из нескольких быстрых щелчков, пытавшихся закрыть приложение, вы можете установить метку время, что позволит только один близкому событию, которое планируется провести в каждом три вторых временном окне:

private Boolean exit = false; 
    private long timeStamp = 0; 
    private Handler handler = new Handler(); 
    @Override 
    // Detect when the back button is pressed 
    public void onBackPressed() { 
     if(webView.canGoBack()) { 
      webView.goBack(); 
     } 
     else { 
      if (exit) { 
       exit = false; //added 
       this.finish(); 
      } 
      else { 

       //added: 
       if (timeStamp == 0 || (System.currentTimeMillis() - timeStamp) > 3000) { 
        Toast.makeText(this, "Press again to exit.", 
         Toast.LENGTH_SHORT).show(); 
        exit = true; 

        timeStamp = System.currentTimeMillis(); //added 

        handler.postDelayed(new Runnable() { 
         @Override 
         public void run() { 
          exit = false; 
         } 
        }, 3 * 1000); 
       } 
      } 

     } 
    } 
+0

Просто любопытно: почему Boolean вместо boolean? Кроме того, отличный ответ, вы заслуживаете моего голоса;) – 2Dee

+0

@ 2Dee Это было частью кода OP, я просто оставил его там. Благодаря! –

+0

К сожалению, пропустили это, извините: - /. – 2Dee