2013-09-23 15 views
9

Mam problem z testowaniem kodu Handler z Robolectric. Na przykład: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(); 
     } 
    }); 
    } 
} 

Jak uruchomić kod natychmiast w Runnable? Nie działa przed wykonaniem mojego testu.

+0

Zadzwoniłaś Client.doSomeStuff() na głównym wątku lub wątek tła? – Poly

Odpowiedz

8

myślę, że to powinno uczynić pracę:

Robolectric.runUiThreadTasks(); 

czy tam kilka zadania zaplanowane:

Robolectric.runUiThreadTasksIncludingDelayedTasks(); 
+0

** nierozwiązane odwołanie runUiThreadTasks ** –

11

Dla Robolectric wersji 3.0 należy użyć: org.robolectric.Robolectric.flushForegroundThreadScheduler
lub
org.robolectric.shadows.ShadowLooper.runUiThreadTasks
org.robolectric.shadows.ShadowLooper.runUiThreadTasksIncludingDelayedTasks

referencyjny: 2.4 to 3.0 Upgrade Guide

+0

Nie można rozpoznać symbolu ** ShadowLooper ** –

3

W Robolectrie 3.0 można zrobić

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;