2013-06-05 2 views
3

В моем приложении я создал диалоговое окно при нажатии кнопки и начал обработчик при создании диалога. Теперь я хочу удалить обратные вызовы обработчика после отклонения диалога и активности, поэтому я создал обработчик метода oncreate активности, которая постоянно проверяет флаг, который я устанавливаю true, когда диалог отклоняется и когда флаг становится обратным вызовом обработчика, должен быть удален, но обратные вызовы обработчика не удаляются.Как проверить, имеет ли обработчик обратный вызов

final Handler handler_Alerts = new Handler(); 
    Runnable r_Alerts = new Runnable() { 
    public void run() { 
     if(Flag){ 
      handler1.removeCallbacks(rhandler1); 
      } 
    Toast.makeText(getApplicationContext(), "In Handler", Toast.LENGTH_SHORT).show(); 
    handler_Alerts.postDelayed(this, 1000); 
        } 
     }; 

    handler_Alerts.postDelayed(r_Alerts, 1000); 
+0

Вы хотите удалить функцию обратного вызова, если он не имеет обратного вызова? Как вы можете удалить что-то, чего не существует? –

+0

"" "Теперь я хочу удалить обратный вызов обработчика, если он не имеет обратных вызовов." "" как. вы хотите удалить что-то, чего не существует? – pskink

+0

Извините за это предложение, но есть ли какой-либо метод, например handler.hasmessage() для обратного вызова, чтобы я мог проверить, прежде чем удалять обратный вызов, который обработчик имеет обратный вызов, и мне нужно удалить этот обратный вызов – ashokk

ответ

1

Невозможно проверить, не имеет ли он исключительного исполнения. Вы можете позвонить

handler_Alerts.remove(r_Alerts); 

, чтобы удалить экземпляр r_Alerts внутри очереди обработчика, или

handler_Alerts.remove(null); 

удалить все работоспособным в очереди

2

Если вы хотите, вы можете отправить пустое сообщение когда вы сначала вставляете обратный вызов, а затем проверяете это сообщение в обработчике. Это пустое сообщение может означать, что есть обратный вызов. Удаление этого сообщения позже можно было бы использовать аналогично, чтобы увидеть, есть ли обратный вызов. У вас нет соответствующей ситуации, такой, как это происходит, но подумал, что я, по крайней мере, попытаюсь поделиться возможностью.

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

... Это, вероятно, не является идеальным, но может быть потенциальным решением, если у вас есть доступ к обработчику от точки, где используется ваш обратный вызов. Не уверен, есть ли прямой способ узнать.

for detail...

+7

Это выглядит как атрибуции дословной копией этот ответ: http://stackoverflow.com/a/15816840/3063884 – CJBS

Смежные вопросы