2010-12-13 61 views
12

J'ai un gestionnaire que je me sers comme suit:Android, pause et reprendre gestionnaire callbacks

handler.postDelayed(Play, 1000); 

quand est appelée avant que cela fait ma demande OnPause(), je dois la mettre en pause et lui dire non pour effectuer le "postDelayed" jusqu'à ce que je reprenne. Est-ce possible, ou existe-t-il un autre moyen de le faire? Mon problème est que lorsque onPause() est appelé, je mets en pause l'audio (SoundManager), mais si ce handler.postDelayed est appelé après cela, l'audio ne sera pas suspendu et continuera à jouer avec mon application en arrière-plan .

@Override 
public void onPause() 
{ 
    Soundmanager.autoPause() 
} 

mais le postDelayed après 1000ms redémarre l'audio.

Répondre

13

Avez-vous essayé avec:

@Override 
public void onPause() 
{ 
    handler.removeCallbacks(Play); 
    Soundmanager.autoPause() 
} 

Ger

+1

Oui, mais si je reprends ceci, le son que le rappel a été supprimé n'a jamais commencé à jouer Il n'y a rien à reprendre. Je veux toujours qu'il reprenne ce son. (Ou démarrez-le s'il n'a pas déjà démarré). – Hamid

+3

Vous pouvez implémenter la méthode onResume et y exécuter handler.postDelayed (Play, 1000); – ggomeze

+2

C'était il y a longtemps, et j'ai une expérience significative d'Android depuis cette question. Je vais accepter cette réponse, car il est correct que je devrais supprimer le rappel en pause. – Hamid

16

Vous devez sous Handler et mettre en œuvre des méthodes pause/reprendre comme suit (alors il suffit d'appeler handler.pause() lorsque vous voulez faire une pause de traitement des messages, et appelez handler.resume() quand vous voulez le redémarrer):

class MyHandler extends Handler { 
    Stack<Message> s = new Stack<Message>(); 
    boolean is_paused = false; 

    public synchronized void pause() { 
     is_paused = true; 
    } 

    public synchronized void resume() { 
     is_paused = false; 
     while (!s.empty()) { 
      sendMessageAtFrontOfQueue(s.pop()); 
     } 
    } 

    @Override 
    public void handleMessage(Message msg) { 
     if (is_paused) { 
      s.push(Message.obtain(msg)); 
      return; 
     }else{ 
       super.handleMessage(msg); 
       // otherwise handle message as normal 
       // ... 
     } 
    } 
    //... 
} 
+2

Travailler, Merci l'homme. cela devrait être la réponse acceptée. –

+0

Où est la méthode 'run' pour le thread? – Si8

+1

Il n'y a pas de méthode d'exécution. Un gestionnaire n'est pas un thread séparé (il s'exécute dans votre thread). – CpnCrunch