robolectric:Handler.postDelayed立即运行

时间:2015-01-23 00:53:52

标签: android testing handler robolectric

我正在使用Robolectric 3.0(ToT)。

在我onCreate的活动中,我进行了以下调用:

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

然后在我的Robolectric测试案例中,我设置了活动,并立即启动了runnable(当它发生时,它调用finish())。我怎样才能防止这种情况发生?

我使用ShadowLooper.pauseMainLooper();来阻止Runnable的触发,但这对我来说不是一个好的解决方案。我正在测试中发送广播,并且当主要活套暂停时它们不会收到。当我取消它时,意图被传递给广播接收器并运行Runnable。如何让广播接收器运行,而不是延迟 Runnable

2 个答案:

答案 0 :(得分:0)

我没有太多将Runnables发布到Handler或使用Looper的经验。如果我是你,我会使用Handler Messages来请求某个动作发生。您可以使用Handler.SendMessageDelayed(message,time)来延迟任务发生,并Handler.SendMessage(message)执行即时任务。您需要在Handler的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
}

我希望这会有所帮助。

答案 1 :(得分:0)

深入研究roboletics我看到roboletics将立即运行未来的任务(为什么你问?我的猜测是他们不希望你等待任务)但会更新一个名为 currentTime 的变量(Scheduler。新的假时间。

所以你不要再等待任务了。

而且似乎还有一个设计缺陷,他们实际上并没有正常运行任务,因为没有等待的事情。 例如,如果您将在 onLooperPrepared()中调用 handler.sendEmptyMessage(),则该任务将立即发出并且不会排队或等待结束onLooperPrepared()致电。

至于现在,我试图自己模仿Looper,我取得了一些成功。