我正在使用Robolectric 3.0(ToT)。
在我onCreate
的活动中,我进行了以下调用:
mHandler.postDelayed(mRunnable, 10 * 60 * 1000)
然后在我的Robolectric测试案例中,我设置了活动,并立即启动了runnable(当它发生时,它调用finish()
)。我怎样才能防止这种情况发生?
我使用ShadowLooper.pauseMainLooper();
来阻止Runnable
的触发,但这对我来说不是一个好的解决方案。我正在测试中发送广播,并且当主要活套暂停时它们不会收到。当我取消它时,意图被传递给广播接收器并运行Runnable
。如何让广播接收器运行,而不是延迟 Runnable
。
答案 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,我取得了一些成功。