2016-08-17 2 views
0

У меня есть интерфейс, называемый, например, PlacesDataSource, для получения списка мест. Он имеет метод, называемый Place getPlaces().Использование шаблона объекта доступа к данным с помощью дооснащения

У меня есть два класса, которые реализуют этот интерфейс, который получает места из локальной базы данных, один идет в сети и делает сетевые запросы.

Для реализации на местном уровне у меня есть:

List<Place> getPlaces() { 
    return mDatabase.getThoseGoodPlaces(); 
} 

Для интернет-реализации, у меня есть:

List<Place> getPlaces() { 
    Response<List<Place>> response = myOnlineApi.getThoseGoodPlaces().execute(); // synchronous request 
    return response.body() 
} 

Однако, это приведет к NetworkOnMainThreadException. Я могу изменить метод интерфейса на void getPlaces(), чтобы использовать асинхронный запрос. Но это не выглядит правильным.

Как обычно определить интерфейс, реализовать локальную и онлайн-версию, используя шаблон объекта доступа к данным?

+0

Я не знаю, как заставить его выглядеть правильно, но доступ к db из нити пользовательского интерфейса выглядит неправильно – lelloman

ответ

0

Использовать интерфейс Observable> getPlaces(), где Observable <> - от rxJava. Модернизация будет получать данные из REST и будет проходить через метод .onSubscribe() этого Obervable. Для db оберните вызовы db в один и тот же метод. Затем вы можете обновлять данные из Интернета, сохранять их в db и возвращать результат в одну цепочку операторов.

Observable.just(someQueryArgs) 
.subscribeOn(Schedulers.io()) 
.map(param -> webApi.doWebQuery(param)) 
.map(response -> saveResponseToDB(response)) 
.observeOn(AndroidSchedulers.mainThread()) 
.subscribe(result -> updateUI(result)); 
Смежные вопросы