Robolectric: Loop Handler in meinem Fall

Ich habe eine sehr einfache Klasse, die einen Handler , wenn sie die Nachricht verarbeitet, sendet sie wieder neue Nachricht:

 public class MyRepeatTask{ … public void startTask() { // send message with delay 5 sec handler.sendMessageDelayed(handler.obtainMessage(…), 5000); } Handler handler = new Handler() { @Override public void handleMessage(Message msg) { // I put a log for unit test System.out.println(“handling message …”); // send message with delay again handler.sendMessageDelayed(handler.obtainMessage(…), 5000); } } } 

Wie Sie oben sehen, wenn startTask() aufgerufen wird, beginnt der Handler, eine Nachricht in 5 Sekunden zu senden. Dann, in handleMessage() Rückruf, sendet der handler erneut eine Nachricht mit 5 Sekunden Verzögerung. Der Zweck ist, wiederholt eine Aufgabe zu tun (wie System.out.println() ).

  • Streaming Audio zwischen externen Bluetooth-Gerät und Android-Handy
  • Ist Scala auf Android es wert? Gibt es viel Overhead? Probleme?
  • Android java.lang.IllegalArgumentException: Dienst nicht registriert
  • Wie kann ich die console.log () - Ausgabe in der PhoneGap App mit Eclipse und HTC Desire HD anzeigen?
  • Android: Erkennung einer anderen Anwendung hat begonnen, Audio zu spielen
  • Animation ansehen rechts nach links android
  • Ich teste die obige Klasse mit Robolectric :

     @RunWith(RobolectricTestRunner.class) public class MyRepeatTaskTest { @Test public void testStartTask() { MyRepeatTask task = new MyRepeatTask(); task.startTask(); // run looper of 'handler' in task ShadowLooper shadowLooper = Shadows.shadowOf(task.handler.getLooper()); shadowLooper.runToEndOfTasks(); // sleep for 30 seconds Thread.sleep(30 * 1000); } } 

    Ich erwarte, dass die System.out.println() Nachricht " handling message … " alle 5 Sekunden zu sehen. Allerdings, wenn ich meinen Test ausführen, sehe ich nur die Nachricht einmal im Terminal.

    Es sieht so aus, als ob der Looper nur für eine Aufgabe gelaufen ist, dann hat er aufgehört.

    Wenn ich recht habe, wie kann man den Greifer die ganze Zeit in Robolectric laufen lassen? Wenn ich mich irre, warum sehe ich nur eine Log-Nachricht?

    ========== UPDATE ===========

    Ich habe versucht Antwort von @rds, ich habe Thread.sleep(30 * 1000); durch:

     for (int i = 0; i < N; i++){ shadowLooper.runToEndOfTasks(); } 

    Jetzt kann ich N mal sehen " handling message … ". ABER, der ganze Test simuliert nicht die Verzögerung. Ich habe 5 Sekunden Verzögerung beim Senden von Nachricht mit handler.sendMessageDelayed(handler.obtainMessage(…), 5000) , ist es so, dass Robolectric Framework nicht simuliert diese Art von Verzögerung Nachricht überhaupt ??? Wie kann ich die Verzögerung bei meinem Test haben?

  • Out of Memory Error beim Laden von Bitmaps
  • Android - programmgesteuert erstellen view progressBar
  • Wie füge TextView in der Mitte von SeekBar Daumen hinzu?
  • Choreograph NullPointerException
  • ListDie dynamische Element hinzufügen
  • View's getWidth () und getHeight () zurückgeben 0
  • 3 Solutions collect form web for “Robolectric: Loop Handler in meinem Fall”

    Das Problem ist, dass, wenn Sie runToEndOfTasks(); aufrufen runToEndOfTasks(); Es gibt zu diesem Zeitpunkt nur eine Aufgabe.

    Anstatt den Test-Thread zu schlafen, solltest du shadowLooper.runToEndOfTasks(); anrufen shadowLooper.runToEndOfTasks(); N mal, um N Anrufe von deinem Handler zu haben.

    Ich habe bei der Implementierung eines geplanten Downloads von api-webservice auf ähnliche Probleme gestoßen. Ich habe einen Timer stattdessen zusätzlich zu einem Handler implementiert. Ich habe das getan, um jeden Tag eine Aufgabe zu machen (oder in einigen Fällen). Sie können auch die Anzahl der Zeiten einstellen …

    Timer Referenz Android

    Es scheint, du suchst nach ShadowLooper#idle(long) . Dies ermöglicht es Ihnen, die Zeit des Handlers sorgfältig voranzutreiben und zu behaupten, wenn die Aufgabe in verschiedenen Intervallen ausgeführt wird oder nicht.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.