2017-08-12 8 views
0

Donc, j'ai une question, et si c'est un stupide je m'excuse à l'avance, j'ai essayé de le chercher, mais je ne sais pas quoi chercher exactement. J'essaye d'exécuter une tâche retardée, mais seulement si mon int = 0, cela fonctionnerait-il correctement comme je le veux?Android Handler/Timer Demande

public static void runTask(String p) 
{ 
    Handler handler = new Handler(); 
     handler.postDelayed(new Runnable() { 
      @Override 
      public void run() 
      { 
       pendingRequest = pendingRequest - 1; 
       if (pendingRequest == 0) 
       { 
         context.startActivity(p); 
       } 
      } 
     }, 4000); 
    } 

} 

ce que je veux faire est de lancer que si pendingRequest est 0, mais je dois d'autres activités qui ajoutent à l'attente de la demande après la runTask() est appelée. Si cela n'a aucun sens, faites le moi savoir et je vais essayer de le reformuler.

+0

Il semble que cela fonctionne, avez-vous des problèmes? – natario

+0

Eh bien ça ne marche pas, c'est la chose, je l'ai juste implémenté dans mon code et ça ne lance jamais l'activité. Je ne sais pas si c'est fini de l'écrire, parce qu'il y a plusieurs endroits que je peux utiliser, parfois même dos à dos, c'est pourquoi je demandais si cela fonctionnerait pour ça, où même si ça s'appelle plusieurs fois ça reste fait ce dont il a besoin une fois que pendingRequest atteint zéro. – Jayce

Répondre

0

Ceci est un peu une façon obscure de faire les choses afin de voir juste cet extrait je ne peux pas dire exactement quel est le comportement souhaité, cependant, cela devrait fonctionner si vous définissez le paramètre "p" final. Je ne connais pas non plus une méthode startActivity qui prend une chaîne au lieu d'une intention, mais je ne peux pas dire si "context" est en fait un objet Android Context, mais je suppose que c'est le cas. Ce dont je ne suis pas sûr, c'est pourquoi vous attendez 4 secondes avant de décrémenter pendingRequest. Je pense que vous voulez décrémenter, laisser 4 secondes pour quelqu'un d'autre pour ajouter une demande en attente, et si c'est toujours 0 après l'attente démarrer l'activité ... mais, encore une fois, je ne peux pas dire à partir de l'extrait.

+0

Vous êtes sur la bonne voie avec ce que je veux faire, essentiellement tant que pendingRequest arrive, je ne veux jamais exécuter le code, à moins que, après 4 secondes, il n'y ait plus de quête. Je suppose que je ne comprends pas comment il réagit quand je dis que j'ai 3 activités qui appellent 'runTask' dans les 2 secondes les uns des autres. Est-ce qu'il attend encore 4 secondes à partir de la première requête, ou va-t-il se réinitialiser chaque fois que 'runTask' est appelé? – Jayce

0

Essayez ceci:

private static Object requestLock = new Object(); 
public static void runTask(final String p) 
{ 
    synchronized(requestLock) 
    { 
     if (--pendingRequest > 0) // Decrement first 
     { 
      // There are more requests 
      return; 
     } 
    } 

    // Wait 4 sec and if there are still no requests start the activity. 
    Handler handler = new Handler(); 
     handler.postDelayed(new Runnable() { 
      @Override 
      public void run() 
      { 
       synchronized(requestLock) 
       { 
        if (pendingRequest == 0) 
        { 
         context.startActivity(p); 
        } 
       } 
      } 
     }, 4000); 
    } 
} 

Remarque: Vous devrez également ajouter un bloc synchronisé où vous incrémenter les pendingRequests.

+0

Ce n'est pas sur l'interface utilisateur, tout est fait à partir de l'activité en arrière-plan, c'est pourquoi j'étais curieux de savoir si elle écraserait à chaque fois que la tâche est appelée. – Jayce

+0

Ah, ok donc vous aurez envie d'appeler "new Handler (Looper.getMainLooper())" parce que vous voudrez l'exécuter sur l'interface utilisateur. Mais non, la tâche ne sera pas annulée si quelqu'un d'autre l'appelle; cependant, puisque vous faites a ==, cela devrait être correct car la valeur serait -1 ou moins si vous avez déjà atteint le code startActivity et ALORS quelqu'un d'autre appelé runTask. – Ackerbar