我有一个名为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 :(得分:0)
使用界面Observable&gt; getPlaces()其中Observable&lt;&gt;来自rxJava。 Retrofit将从REST获取数据,并将其传递给该Obervable的.onSubscribe()方法。对于db,将db调用包装为相同的方法。然后,您可以从Web更新数据,将其保存到db并将结果返回到一个运算符链中。
Observable.just(someQueryArgs)
.subscribeOn(Schedulers.io())
.map(param -> webApi.doWebQuery(param))
.map(response -> saveResponseToDB(response))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(result -> updateUI(result));