2013-04-04 36 views
7

Mam kod, który ustawia licznik czasu, ale jeśli użytkownik ustawi licznik czasu, gdy jest on używany, muszę usunąć operację, która uruchamia timer i uruchomić go ponownie. Ale gdy nie istnieje żaden program wywoływania zwrotnego programu obsługi i ten kod jest nazywany, to powoduje awarię mojej aplikacji. Muszę więc sprawdzić, czy program obsługi jest uruchomiony, jeśli tak, to zakończyć go i ponownie uruchomić, ale przeglądając dokumentację i inne pytania Stackoverflow, nie widzę, czy jest to możliwe.Sprawdź, czy obsługa Androida ma oddzwonienia

Tu jest mój kod, mam skomentował wokół kodu, który powinien być wykonywany tylko wtedy, gdy istnieje obsługi runnable:

submitTimer.setOnClickListener(new View.OnClickListener(){ 

     public void onClick(View v) { 
      String s = timer.getText().toString(); 
      if(!s.equals("")) 
      { 
//I NEED TO CHECK A RUNNABLE HANDLER EXISTS AND IF SO THEN RUN THIS CODE, IF NOT IGNORE THIS CODE 
      Map.handler.removeCallbacks(Map.getRunnable()); 
      Map.runnable.run(); 
//I NEED TO CHECK A RUNNABLE HANDLER EXISTS AND IF SO THEN RUN THIS CODE, IF NOT IGNORE THIS CODE 
      int l = Integer.parseInt(s); 
      Map.timerinmins = l; 
      timer.setHint("Current Timer is "+Map.timerinmins); 
      timer.setText(""); 
      Toast.makeText(Preferences.this, "Timer is set!", Toast.LENGTH_SHORT).show(); 
      } 

      else 
      { 

       Toast.makeText(Preferences.this, "No value was entered", Toast.LENGTH_SHORT).show(); 
      } 
    } 

}); 

Czy ktoś może mi pomóc znaleźć sposób na sprawdzenie teleskopowe stan obecny?

Odpowiedz

4

Jeśli chcesz, możesz wysłać pustą wiadomość, gdy po raz pierwszy włączysz wywołanie zwrotne, a następnie sprawdź komunikat w module obsługi. Ta pusta wiadomość może oznaczać, że istnieje połączenie zwrotne. Usunięcie tej wiadomości później może być następnie wykorzystane w podobny sposób, aby sprawdzić, czy wywołanie zwrotne nadal istnieje. Nie ma takiej sytuacji, jak ta, z której pochodzę, ale pomyślałem, że przynajmniej spróbuję i udostępnię taką możliwość.

... 
Map.handler.sendEmptyMessage(CALLBACK_PRESENT_INTEGER); 
... 
if(Map.handler.hasMessages(CALLBACK_PRESENT_INTEGER) 
... 
Map.handler.removeMessage(CALLBACK_PRESENT_INTEGER); 
... 

Jest to prawdopodobnie nie jest idealny, ale może być potencjalnym rozwiązaniem, jeśli masz dostęp do obsługi od punktu, w którym jest używany Twój zwrotna. Nie wiem, czy istnieje bezpośredni sposób, aby się tego dowiedzieć.

3

Odnosząc się do odpowiedzi Jay Snayder „s:

Ponieważ istnieją przypadki, w których Map.handler.hasMessages(CALLBACK_PRESENT_INTEGER) zwraca false mimo Map.handler.sendEmptyMessage(CALLBACK_PRESENT_INTEGER) zostało nazwane (zdarzyło mi też), to może być bezpieczniejsze w użyciu logiczną do ustalenia, czy handler ma wywołania zwrotne lub nie.
Więc logika kod jest czymś bardzo prostym tak:

... 

boolean callbackPresent = false; 

... 

if(!callbackPresent) { 

    // do what you have to do in case the handler doesn't have callbacks 

    // right before adding a callback to the handler, call: 
    callbackPresent = true; 

} else { 

    // do what you have to do in case the handler has callbacks 

    // right before removing the callbacks from the handler, call: 
    callbackPresent = false; 
} 

... 

Używam tego rozwiązania w aplikacji i wszystko działa doskonale.