RxJava运营商

6 java android rx-java

我正在使用这篇文章学习rxjava:http://blog.danlew.net/2014/09/22/grokking-rxjava-part-2/ 并且无法重现我接下来做的这篇文章的第一个例子:

Observable<List<String>> query(String text); //Gradle: error: missing method body, or declare abstract

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    query.subscribe(urls -> {    //Gradle: error: cannot find symbol variable query
        for (String url : urls) {
            System.out.println(url);
        }
    });

}
Run Code Online (Sandbox Code Playgroud)

但我有一个错误,我添加了评论我做错了什么?

Alo*_*uez 6

除了Java 8 lambdas之外,这里的大多数人都错过了这样一个事实:无论是RetroLambda还是其他任何漂亮的工具,你都可以在Android中找到错过的lambda特性来解决你的代码:

所以,仔细看看你的代码,你甚至在代码片段中添加了一些注释,它们实际上解释了为什么你有一些编译错误:

1你有一个空体的方法:

Observable<List<String>> query(String text);
Run Code Online (Sandbox Code Playgroud)

因此,为它添加一个方法体并解决问题.你想让我做什么?你还不知道吗?然后添加一个虚拟或空体并稍后解决:

Observable<List<String>> query(String text) {
  return Observable.just(Arrays.asList("url1", "url2"));
}
Run Code Online (Sandbox Code Playgroud)

2 query代码中根本没有变量.你得到的是一个query方法,使用方法的语法要求你使用大括号:

query("whatever").subscribe(urls -> {
        for (String url : urls) {
            System.out.println(url);
        }
    });
Run Code Online (Sandbox Code Playgroud)

现在添加RetroLambda或使用匿名类,您就完成了.请记住,没有任何内容可以为您的代码添加更多功能,但只会解决那些编译错误.现在问问自己,在查询方法中你想做什么并继续.

注意:Observable对象是一个数据流,这基本上意味着你可能得到零元素,一个元素或许多元素; 所有这些指定类型的实例.所以你的代码似乎期望一串字符串列表,如果你真正想要的是一串字符串,那么替换Observable<List<String>>Observable<String>.