我正在学习RxJava,并通过几篇文章和视频.我完全觉得RxJava可以提供什么,所以我认为目前了解Reactive Programming的意义. This tutorial by Dan Lew帮助我理解了使用RxJava的基础知识.但是我发现我越是认为我已经完全理解了RxJava,我脑子里就会出现越多的问题.
因为我是一个在编写代码时学到最多的人,所以这就是我想要做的.我已经有一个使用SQLite的应用程序.我的应用程序有7个饼图,它从数据库游标中获取数据.每个饼图从光标获取不同的数据行(浮点值),并根据其数据生成图表.
我现在要做的是,我想使用RxJava从数据库中检索数据并填充图表.但我对RxJava应该如何与数据库交互感到茫然.我是否需要使用任何其他库来执行此操作?因为我发现rxjava-jdbc和SqlBrite我认为应该帮助我,但我真的需要它们吗?我还发现了一个question in SO似乎没有使用任何额外的库(当然除了RxJava),他似乎使用ContentObservable但我仍然没有完全得到它.除了回答他的问题的人甚至不使用ContentObservable.我只知道Android有自己的Observable类..它是否与RxJava一起使用是完全兼容的?如果没有,为什么同名?
有人请帮帮我…
================================================== ======
回应下面的GreyBeardedGeek解决方案:
这是我的Callable,它从sqlite中检索数据
public class GetIncome implements Callable<Map<String,String>> {
public static final String FILE_NAME = "CGetIncome";
Context myContext;
int year, month;
public GetIncome(Context context, int getYear, int getMonth){
myContext = context;
year = getYear;
month = getMonth;
}
@Override
public Map<String,String> call() throws Exception {
Map<String,String> output = new HashMap<>();
JarControl jc = new JarControl(myContext);
JSONObject getIncome = jc.getIncome(year,month,0,0);
output.put("necessities",getIncome.getString("necessities"));
output.put("savings",getIncome.getString("savings"));
return output;
}
}
以下是我尝试使用主要活动中的Callable:
Callable<Map<String,String>> getIncome = new GetIncome(getContext(),2015,9);
现在我不知道如何将getIncome可调用到Observables中.你在rx中提到fromCallables应该这样做..但实际上该怎么做?根据this tutorial that shows how to use Observable.from,所以我希望通过Observable.fromCallable能够使用Callables,但显然该函数不存在.快速googled显示.fromCallable应该通过像Async.fromCallable()这样的东西来使用,但由于我对RxJava很新,我只能理解如何根据the tutorial显示的方式创建可调用的…
抱歉我对RxJava的极端虚无
解决方法:
我确信会有其他一些意见,但到目前为止,我采取了几种不同的方法:
>如果你想要一个相对少量的数据(并且你可以保证它的大小总是有一个已知的上限),那么:
>创建一个访问数据库的同步方法,获取游标,迭代游标以创建包含数据的数据结构(例如List),然后返回它.
>创建一个调用该方法的Callable
>使用rx.fromCallable创建一个Observable
>如果需要无限数量的行,请执行与上面类似的操作,但返回Cursor.
编辑:示例代码:
private Map<String, String> getDataFromDatabase() {
Map<String, String> result = new HashMap<>();
// do whatever you need to (i.e. db query, cursor) to fill it in
return result;
}
private Callable<Map<String, String>> getData() {
return new Callable() {
public Map<String, String> call() {
return getDataFromDatabase();
}
}
// in utility class RxUtil.java
public static <T> Observable<T> makeObservable(final Callable<T> func) {
return Observable.create(
new Observable.OnSubscribe<T>() {
@Override
public void call(Subscriber<? super T> subscriber) {
try {
T observed = func.call();
if (observed != null) { // to make defaultIfEmpty work
subscriber.onNext(observed);
}
subscriber.onCompleted();
} catch (Exception ex) {
subscriber.onError(ex);
}
}
});
}
// and finally,
public Observable<Map<String, String>> getDataObservable() {
return RxUtil.makeObservable(getData());
}
【说明】:本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!