2013-09-23 30 views
9

Tôi gặp sự cố khi thử nghiệm mã Handler với Robolectric. Ví dụ:Bài đăng xử lý Robolectric chạy

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(); 
     } 
    }); 
    } 
} 

Làm cách nào để chạy mã trong số Runnable ngay lập tức? Nó không chạy trước khi thử nghiệm của tôi được thực hiện xong.

+0

Bạn có gọi Client.doSomeStuff() trên chủ đề chính hoặc sợi nền? – Poly

Trả lời

8

Tôi nghĩ rằng điều này sẽ làm cho một công việc:

Robolectric.runUiThreadTasks(); 

hoặc nếu có một số nhiệm vụ theo lịch trình:

Robolectric.runUiThreadTasksIncludingDelayedTasks(); 
+0

** Chạy tài liệu tham khảo chưa được giải quyếtUiThreadTasks ** –

11

Đối Robolectric phiên bản 3.0 bạn nên sử dụng: org.robolectric.Robolectric.flushForegroundThreadScheduler
hoặc
org.robolectric.shadows.ShadowLooper.runUiThreadTasks
org.robolectric.shadows.ShadowLooper.runUiThreadTasksIncludingDelayedTasks

tham khảo: 2.4 to 3.0 Upgrade Guide

+0

Không thể giải quyết biểu tượng ** ShadowLooper ** –

3

Trong Robolectrie 3.0 bạn có thể làm

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; 
Các vấn đề liên quan