2015-01-23 3 views
2

Я использую Robolectric 3.0 (ToT).robolectric: Handler.postDelayed запускается немедленно

В моей деятельности в onCreate я сделать следующий вызов:

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

Тогда в моем Robolectric тест случае установки I активность и исполняемым немедленно начал (и как это происходит, это вызывает finish()). Как я могу предотвратить это?

Я использовал ShadowLooper.pauseMainLooper();, который предотвращает обстрел Runnable, но это нехорошее решение для меня. Я отправляю трансляции в тесте, и они не получаются, когда основной петлитель приостановлен. Когда я его приостанавливаю, оба намерения доставляются к широковещательному приемнику и запускается Runnable. Как я могу получить широковещательный приемник для запуска, но не задерживаетсяRunnable.

+0

Я смог воспроизвести одну и ту же проблему с 'robolectric 2.4'. Я бы создал билет на трекер Robolectric (я вижу, вы уже это сделали) и понять их проблему. Может быть, как ожидалось. В качестве обходного пути я бы создал и прокси-класс для планирования событий с delaed и издевательства над ним в тесте. Нехорошо писать дополнительные функции для прохождения теста, но он должен работать –

+0

Я подал билет: https://github.com/robolectric/robolectric/issues/1509 – gruszczy

+0

Эта проблема, похоже, находится в собственном планировщике Android; Я обнаружил, что Handler.postDelayed (foo, 1000) срабатывает примерно через 200 мс, по крайней мере, на Android 4.2. – fluffy

ответ

0

У меня нет опыта работы с публикацией Runnables для Handler или с использованием Looper. Если бы я был вами, я бы использовал сообщения Handler для запроса определенного действия. Вы можете использовать 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) к новое поддельное время.

Так что вы не ждете задач когда-либо, в значительной степени.

А также, кажется, есть дефект дизайна в том, что они фактически не запускают задачи из-за отсутствия ожидания. Например, если вы звоните handler.sendEmptyMessage() в onLooperPrepared() задача будет выдаваться сразу и не будут поставлены в очередь или ждать окончания вызова onLooperPrepared().

На данный момент я попытался издеваться над Лупером, и у меня есть некоторый успех.

Смежные вопросы