2017-01-04 2 views
0
public void isWaitingResponse (boolean isWaiting) { 

    if (isWaiting && dialogLock == null) { 

     dialogLock = new Dialog(this, android.R.style.Theme_Panel); 
     dialogLock.setCancelable(false); 
     dialogLock.show(); 

     // ToDo: If this dialog is still showing after 10 seconds 
     // Call the primary method within and activate the "else" 
     // condition code below to remove dialog, and clear app 
     // state for further communication 

     final Handler handler = new Handler(); 
     handler.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       if (isWaiting && dialogLock != null) { 
        // Recursively call this method as false 
        isWaitingResponse(false); 
       } 
      } 
     }, 5000); 

    } else if (!isWaiting) { 

     if (dialogLock != null) { 

      dialogLock.dismiss(); 
      dialogLock = null; 

     } 

    } 

} 

Как отмечено в комментариях в коде выше, это действительно работает и делает то, что мне нужно для правильной работы. Мне просто интересно, если я ухожу с обработчиком, или если требуется любая дополнительная очистка, чтобы убедиться, что в активном коде нет мусора. Не очень хорошо знакомы с обработчиками.Удаление диалогового окна по истечении установленного времени

UPDATE: Я хотел бы, чтобы этот обработчик не срабатывает, если диалог был закрыт (этот метод был введен с ложным параметром). Поэтому при ложной проверке, если обработчик имел задержку отправки, этот обработчик должен быть отклонен вместе с диалогом. Я должен удостовериться, что более поздний запрос не будет уволен по истечении времени задержки с предыдущим сообщением.

РЕШЕННЫЙ, ОТВЕТ, ПОСМОТРЕННЫЙ СЕБЯ НИЖЕ - Благодаря Yessine.

+0

Вы пытаетесь запустить «Диалог» в течение определенного времени? – OBX

+0

Имейте в виду, что диалог будет закрыт, если вы вращаете устройство. – rekire

+0

@superman: Мне просто нужно убедиться, что диалог не останется там навсегда. Ограничение в 5 или 10 секунд будет прекрасным. – Ben

ответ

1

Этот ответ является реализация предложения @Yessine Mahdouani в.

Во-первых таймер создан:

final Timer timerUnlock = new Timer(); 

При запирании процесс включает в себя также планирование события таймера, который запускается снова сам метод корня:

if (isWaiting && 
     lockDialog == null) 
{ 
    lockDialog = new Dialog(this, android.R.style.Theme_Panel); 
    lockDialog.setCancelable(false); 
    lockDialog.show(); 

    timerUnlock.schedule(new TimerTask() { 
     @Override 
     public void run() { 
      // Close it automatically if running. 
      m_setisWaiting(false); 
     } 
    }, 10000); 
} 

При разблокировке обеспечить любые таймеры отменяются, это предотвращает разблокировку предыдущего таймера блокировки, который еще не завершен и еще не завершен:

else if (!isWaiting) 
{ 
    if (lockDialog != null) { 
     lockDialog.dismiss(); 
     lockDialog = null; 
    } 

    timerUnlock.cancel(); 
} 

И, наконец, код, который будет работать на уровне интерфейса должен быть запущен на главном потоке (это вызывало непрерывные сбои в противном случае - возможно, потому, что таймер заканчивал и запуская из отдельной нити:

runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
     // Remove any timeouts still running. 
     if(progressBar != null) { 
      if(isWaiting) 
       progressBar.setVisibility(View.VISIBLE); 
      else 
       progressBar.setVisibility(View.GONE); 
     } 
    } 
}); 

Full метод был бы таким:

public void m_setisWaiting (boolean isWaiting) { 

    final Timer timerUnlock = new Timer(); 

    if (isWaiting && 
      lockDialog == null) 
    { 
     lockDialog = new Dialog(this, android.R.style.Theme_Panel); 
     lockDialog.setCancelable(false); 
     lockDialog.show(); 

     timerUnlock.schedule(new TimerTask() { 
      @Override 
      public void run() { 
       // Close it automatically if running. 
       m_setisWaiting(false); 
      } 
     }, 10000); 
    } 

    else if (!isWaiting) 
    { 
     if (lockDialog != null) { 
      lockDialog.dismiss(); 
      lockDialog = null; 
     } 

     timerUnlock.cancel(); 
    } 

    runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      // Remove any timeouts still running. 
      if(progressBar != null) { 
       if(isWaiting) 
        progressBar.setVisibility(View.VISIBLE); 
       else 
        progressBar.setVisibility(View.GONE); 
      } 
     } 
    }); 

} 
1

После показа диалогового окна поставить этот код, он будет работать через 10 секунд

new Timer().schedule(new TimerTask() { 
    public void run() { 
    dialogLock.dismiss(); 
     }}, 10000);//time in milliseconds 
+0

Как бы обеспечить, чтобы это расписание не запускалось, если диалог был удален вручную? И «это не имеет значения» будет недействительным, так как новый отдельный объект может запросить новый диалог, который может быть сбит с предыдущим. – Ben

+0

вы можете проверить, отображается ли диалоговое окно: if (dialogLock.isShowing()) {//} –

+0

Я думаю, что решение будет основано на том, что вы описали, но ссылаетесь на таймер в переменной Timer и затем набираете таймер.cancel(), если секция была отменена вручную, останавливая любые таймеры от дальнейшего повторного отклонения диалога. – Ben