Примечание. Ответ ниже основан на Retrofit 1.6.1 — будет обновлено до последней версии. Дооснащение 1.9.0 больше не позволяет устанавливать HttpExecutor
через RestAdapter.Builder
Принятый ответ - это шаг в правильном направлении, но это заставляет меня чувствовать себя некомфортно. На практике вам нужно либо установить AsyncTask.THREAD_POOL_EXECUTOR
для живых и тестовых сборок, либо только для тестовых сборок.
Настройка для обоих будет означать, что весь ваш сетевой пул ввода-вывода будет зависеть от реализации очереди aysnc, которая стала серийный номер по умолчанию для приложений с целевыми версиями ICS+
Настройка только для тестов будет означать, что ваша тестовая сборка отличается от вашей живой сборки, что, по моему мнению, не самое лучшее место для начала тестирования. Кроме того, вы можете столкнуться с проблемами тестирования на старых устройствах из-за изменений в асинхронном пуле.
Выше правильно сказано, что Espresso
уже цепляется за AsyncTask.THREAD_POOL_EXECUTOR
. Давай ковыряться...
Как он это получает?
ThreadPoolExecutorExtractor
Кто/что этим пользуется?
BaseLayerModule
имеет provideCompatAsyncTaskMonitor(ThreadPoolExecutorExtractor extractor)
, который возвращает AsyncTaskPoolMonitor
Как это работает? Взглянуть!
AsyncTaskPoolMonitor
Где он используется?
UiControllerImpl
имеет метод loopMainThreadUntilIdle()
, который вручную вызывает asyncTaskMonitor.isIdleNow()
перед проверкой любых зарегистрированных пользователем idlingResources с помощью idlingResourceRegistry.allResourcesAreIdle()
Я предполагаю, что с Retrofit мы можем использовать метод RestAdapter.Builder.setExecutors(...)
и передать наш собственный экземпляр (или версию) AsyncTaskPoolMonitor
, используя тот же http Executor
, который Retrofit
инициализируется на Android с помощью
@Override Executor defaultHttpExecutor() {
return Executors.newCachedThreadPool(new ThreadFactory() {
@Override public Thread newThread(final Runnable r) {
return new Thread(new Runnable() {
@Override public void run() {
Process.setThreadPriority(THREAD_PRIORITY_BACKGROUND);
r.run();
}
}, RestAdapter.IDLE_THREAD_NAME);
}
});
}
(из здесь а>)
И заверните это в интерфейс IdlingResource
для использования в наших тестах!!
Единственный вопрос в том, что поскольку Retrofit
выполняет обратный вызов, используя отдельный Executor
в mainThread, который опирается на основной Looper, это может привести к проблемам, но я предполагаю, что на данный момент Espresso также привязан к этому . Нужно заглянуть в этот.
person
Dori
schedule
25.02.2015
IdlingResource
должен быть реализован в нем, я просто хотел знать, пробовал ли кто-то еще это. - person Austyn Mahoney   schedule 18.04.2014Retrofit
и его методаRestAdapter.Builder().setExecutor(...)
. Ничего страшного, если я не получу ответа, но я немного подожду, прежде чем писать свою собственную реализацию. - person Austyn Mahoney   schedule 18.04.2014