2015-01-23 5 views
2

Robolectric 3.0 (ToT)을 사용하고 있습니다. 내가 전화 다음 만든다 onCreate 내 활동에robolectric : Handler.postDelayed가 즉시 실행됩니다.

:

mHandler.postDelayed(mRunnable, 10 * 60 * 1000) 

그럼 내 Robolectric 테스트 케이스 I 설정에서 활동하고 실행 가능한 즉시 시작된다 (그리고 공교롭게도,이 finish()를 호출). 어떻게 이런 일이 일어나지 않도록 할 수 있습니까?

나는 Runnable의 해고를 막는 ShadowLooper.pauseMainLooper();을 사용했으나 좋은 해결책은 아닙니다. 테스트에서 방송을 보내고 있으며 주 루퍼가 일시 중지되었을 때 수신되지 않습니다. 일시 중지를 취소하면 인 텐트가 브로드 캐스트 리시버로 전달되고 Runnable이 실행됩니다. 브로드 캐스트 리시버를 실행하려면 어떻게해야합니까? Runnable이 아닙니다.

+0

동일한 문제를 'robolectric 2.4'로 재현 할 수있었습니다. 나는 Robolectric 이슈 트래커에 대한 티켓을 만들 것입니다 (당신이 이미 그것을 본 것을 봅니다). 그리고 문제에 대한 이해를 얻습니다. 예상대로 일 수 있습니다. 임시 해결책으로 델라 이벤트를 스케쥴하고 테스트에서 모의 ​​클래스를 작성하고 프록시 클래스를 작성했습니다. 테스트를 통과하기위한 추가 기능을 작성하는 것은 좋지 않지만 작동해야합니다. –

+0

나는 티켓을 신청했습니다 : https://github.com/robolectric/robolectric/issues/1509 – gruszczy

+0

이 문제는 Android의 자체 스케줄러에있는 것으로 보입니다. 나는 Handler.postDelayed (foo, 1000)가 적어도 안드로이드 4.2에서 약 200ms 후에 발생한다는 것을 발견했다. – fluffy

답변

0

Runnables를 Handler에 게시하거나 Looper를 사용하는 데 많은 경험이 없습니다. 내가 당신이라면 Handler Messages를 사용하여 특정 작업을 요청할 것입니다. 작업을 지연 시키려면 Handler.SendMessageDelayed(message,time)을, 즉각적인 작업을 수행하려면 Handler.SendMessage(message)을 사용할 수 있습니다. 처리기 handleMessage 함수로 작업을 실행해야합니다. 예제 코드를 참조하십시오.

public class incomingHandler extends Handler { 
    @Override 
    public synchronized void handleMessage(Message msg){ 
    switch(msg.what){ 
case 0 : finish(); break; 
case 1 : "RUN FUNCTION OR DO SOMETHING ELSE"; break; 
default : "HAVE YOUR DEFAULT MESSAGE SERVICE HERE";} 
@Override 
protected void onCreate(Bundle savedInstanceState) 

{super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_ui); 
    Handler mHandler = new incomingHandler(); 
    mHandler.sendMessage(Message.obtain(null, 1)); 
//This will cause your function to run immediately 

    mHandler.sendMessageDelayed(Message.obtain(null,0),5000L) ; 
//This will cause you activity to finish after 5 seconds 
} 

나는 희망한다.

+0

이 메시지는 도움이되지 않습니다. 전송 메시지도 즉시 전송됩니다. – gruszczy

+0

아직도 루퍼를 부르시겠습니까? –

+0

나는이 질문을 이해할 수 없을까 걱정됩니다. – gruszczy

0

이 roboletics에 파고 내가 roboletics 바로 미래의 작업을 실행할 것을보고 만에 currentTime을 (Scheduler.class)라는 변수를 업데이트합니다 (당신은 왜 물어? 내 생각 엔 그들이 작업을 기다리는 당신을 싶지 않는 것입니다) 새로운 가짜 시간.

그래서 작업을 거의 기다리지 마세요.

또한 디자인 상 결함이있는 것 같습니다. 실제로 대기 작업이 없기 때문에 실제로 작업을 실행하지 않습니다. onLooperPrepared() 작업이 즉시 발급되며, 대기 또는 onLooperPrepared() 호출의 마지막을 기다릴 수 없습니다 당신이 handler.sendEmptyMessage을 (호출 예)를 들어 .

저는 지금 루퍼를 조롱하려고 노력해 왔지만 성공했습니다.

관련 문제