将数据访问对象模式与Retrofit一起使用

时间:2016-08-17 10:40:33

标签: android design-patterns retrofit

我有一个名为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()以使用异步请求。但这看起来并不合适。

在使用数据访问对象模式时,通常如何定义接口,实现接口的本地版本和在线版本?

1 个答案:

答案 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));