2013-09-23 3 views
9

Je rencontre des difficultés pour tester le code Handler avec Robolectric. Par exemple:Robolectric Run Handler post

public class Client { 
    private Handler mMainThreadHandler; 

    public interface Callback{ 
    void ok(); 
    } 

    public Client() { 
    mMainThreadHandler = new Handler(Looper.getMainLooper()); 
    } 

    public void doSomeStuff(Callback callback){ 
    //doing... 
    mMainThreadHandler.post(new Runnable(){ 
     @Override public void run() { 
     callback.ok(); 
     } 
    }); 
    } 
} 

Comment exécuter le code dans le Runnable immédiatement? Il ne fonctionne pas avant l'exécution de mon test.

+0

Est-ce que vous appelez Client.doSomeStuff() sur fil conducteur ou fil d'arrière-plan? – Poly

Répondre

8

Je pense que cela devrait faire un travail:

Robolectric.runUiThreadTasks(); 

ou en cas de plusieurs tâches prévues:

Robolectric.runUiThreadTasksIncludingDelayedTasks(); 
+0

** Référence non résolue runUiThreadTasks ** –

11

Pour la version Robolectric 3.0 vous devez utiliser: org.robolectric.Robolectric.flushForegroundThreadScheduler
ou
org.robolectric.shadows.ShadowLooper.runUiThreadTasks
org.robolectric.shadows.ShadowLooper.runUiThreadTasksIncludingDelayedTasks

Référence: 2.4 to 3.0 Upgrade Guide

+0

Impossible de résoudre le symbole ** ShadowLooper ** –

3

Dans Robolectrie 3.0, vous pouvez faire

HandlerThread thread = new HandlerThread("test"); 
thread.start(); 
Handler handler = new Handler(thread.getLooper()); 
handler.post(new Runnable() {run(){ 
    int a = 0; 
}}; 
((ShadowLooper) ShadowExtractor.extract(thread.getLooper())).idle(); // this will execute line int a = 0;