Запрос в Android всегда дает исключение тайм-аута сокета

Я пытаюсь сделать два запроса, когда пользователь нажимает кнопку. Однако запрос может занять некоторое время.

Когда пользователь находится в режиме экономии заряда батареи и экраны блокируют его устройство, пока запрос все еще выполняется, запрос не будет выполнен и выдаст исключение тайм-аута сокета.

Я сделал пример проекта, чтобы попробовать это, и вы можете найти его здесь.

Я использую модификацию и RxJava, чтобы делать такие запросы:

 networkFactory.request()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(
                        { result -> Log.d("TAG", "The value is this $result") },
                        { error -> Log.e("TAG", "Ohoh an error ${Log.getStackTraceString(error)}")
                        })

Мой запрос networkFactory():

 fun request(): Observable<Doc> {
        return service.request(API_KEY)
 }

со следующим интерфейсом:

@GET("articlesearch.json")
fun request(@Query("api-key") apiKey : String) : Observable<Doc>

Я делаю что-то не так здесь?


person iGoDa    schedule 20.07.2017    source источник
comment
похоже, это из-за developer.android.com/ обучение/мониторинг-состояния-устройства/   -  person Pavneet_Singh    schedule 20.07.2017
comment
Ясно, а через какое-то время дремать не надо? Я имею в виду, я думаю, что на Android O кикает сразу после выключения экрана, но в Marshmallow это также применимо?   -  person iGoDa    schedule 20.07.2017
comment
вы упомянули, что When the user is on battery save mode кажется более строгим, остальное я не уверен на 100%   -  person Pavneet_Singh    schedule 20.07.2017
comment
о да, но тогда как я могу сделать жизнеспособный запрос? Doze срабатывает и обрывает интернет-соединение, пока пользователь использует приложение. С точки зрения пользователя, если у него разряжена батарея и он хочет послушать музыку, например, он не будет знать, почему приложение перестало работать, и будет винить неисправное приложение...   -  person iGoDa    schedule 20.07.2017
comment
вы можете изучить этот stackoverflow.com/questions/32627342/   -  person Pavneet_Singh    schedule 21.07.2017
comment
если ваш сетевой вызов занимает много времени, вы можете сделать это в ограниченном сервисе... сообщить пользователю, что делает приложение. видимая часть приложения имеет наивысший приоритет. поэтому система не могла его убить.   -  person Mohamed Ibrahim    schedule 26.10.2017