Я реализовал решение, используя предложения из этого сеанса ввода-вывода Google, и оно мне очень помогло.
Для извлечения данных с удаленного сервера обязательным является фоновый поток, поскольку вы не можете заблокировать поток пользовательского интерфейса, ожидая ответа от сервера. Самый простой способ сделать это - AsyncTask, который получает данные с сервера в doInBackground
, а затем выполняет любые обновления пользовательского интерфейса или сохранение данных, которые должны произойти в onPostExecute
. Этот подход будет работать достаточно хорошо для многих случаев использования, но проблема, на которую обращался сеанс ввода-вывода Google, заключалась в том, что вы потеряете данные, если ваша активность будет прервана во время ожидания ответа от сервера. Решения, предложенные на этом сеансе, представляли собой способы сохранить данные, чтобы их можно было хранить так, чтобы они не были привязаны к действию.
Используя Сервис, вы можете отделить получение данных от Действия. (Имейте в виду, что вам все равно нужно будет создать отдельный поток в Сервисе для извлечения данных, поскольку Сервис все еще работает в потоке пользовательского интерфейса.) ContentProvider вступает в игру при передаче информации из Сервиса в Активность, которая запросила данные сервера. Вы можете использовать базу данных для хранения ответа. Затем Activity может получить ответ из базы данных.
SyncAdapter может использоваться для повторения неудачных серверных вызовов и / или получения данных с сервера без специального запроса приложения, поэтому он будет свежим и готовым, когда оно потребуется приложению. Конечно, это действительно следует использовать очень экономно, так как это может немного разрядить аккумулятор.
Я бы настоятельно рекомендовал, по крайней мере, придерживаться подхода Service / ContentProvider. Я смог использовать это решение, чтобы легко интегрировать механизм кэширования и в мое приложение.
Надеюсь, это поможет.