我正在学习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;
}
}
这是我在主要 Activity 中尝试使用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,但显然该功能不存在。快速Google搜索表明.fromCallable应该通过执行Async.fromCallable()之类的方式使用,但是由于我对RxJava并不陌生,所以我只能根据the tutorial的显示方式来了解如何创建可调用对象...
对于我在RxJava上的极端笨拙感到抱歉
最佳答案
我敢肯定会有很多其他意见,但是到目前为止,我已经采取了两种不同的方法:
编辑:示例代码:
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());
}