Rxjava2~学渣带你扣rxjava2~ 译文(原创翻译)

原创翻译,请勿转载。希望大家一起进步。

简介

当我们学习rxjava的时候,有一天我遇到了rxjava被观察者,我询问的它一些问题。好消息是它真的很好很好 好到让我吃惊,ra真的很坏并且充满着骄傲, 你不想和我们(开发者)交朋友吗而是一直误导我们吗?之后通过沟通我吃惊的意识到了 我的很多观念都是错误的

我 : 你好吗

rx :hi 我很好 谢谢

我 :为什么感觉学习你感觉很难,对于开发者来说你真的不容易。你难道不想和我们做朋友吗

rx :哈哈、 说真的。    我有一些很好的朋友。他们在很多论坛谈论我。他们谈论我和我的力量。这些大家很一些地方真的很出色,他们和我在一起花费了很多时间。so真的朋友需要你的付出,真诚的付出一些时间。但是有一种情况 他们和我交朋友并不真诚,他们指望我一起工作。但是一段时间之后 他们打开了社交网站。把我遗忘了几个小时。所以你怎么指望我和他们成为真正的朋友呢

我 :好吧 如果想和你交朋友我应该怎么做

rx :全身心的投入到我的身上 每一段时间之后 你就会发现我是多么的坦诚

我 :老实说。我并不擅长集中注意力但是我擅长忽略、我将使用这种无视别的,眼中只有你

rx :没错。 如果和你一起的时候 你能够忽略外在的一切 除了我之外的话。 我将是你最好的朋友

我 :wow 我又一种感觉 我们能够成为很好的朋友

rx :任何人都可以把我当作他最好的朋友

我 :现在我有一些问题 我能提问吗

rx :当然 你能够提出任何问题 我将给与你回答,但是一些重要的问题你需要的你拿出一些时间并且投入进去

我 : 当然 如果我有一些数据并且我想把他转化成为被观察者,我如何在rxjava2实现这一点呢

rx :回答这么问题需要很长的篇幅,如果你进入我的内部(Rx Java 2可观察类)。你会知道我总共有12904行代码。 任何方法返回的都是你需要的被观察者。 是的,在我这个群体中 我有很多朋友。我可以根据开发的需求如map,filter等来实现自我。但在这里我可以和你分享一些方法,这些方法可以帮你把任何事情都看作被观察者,抱歉  我有一种感觉那将会很长。所幸并不会太无聊、

1 just();

通过使用这种方法,您可以将任何对象(s)转换为可观察到的对象(s)。

String data = "Hello World";

Observable.just(data).subscribe(s -> System.out.println(s));

Output:

Hello World

如果你有更多的对象,那么你可以通过下面的api来实现

String data = "Hello World";

Integer i = 4500;

Boolean b = true;

Observable.just(data,i,b).subscribe(s -> System.out.println(s));

Output:

Hello World

4500

true

这个api支持最大10个数据

Observable.just(1,2,3,4,5,6,7,8,9,10).subscribe(s -> System.out.print(s+" "));

Output:

1 2 3 4 5 6 7 8 9 10

举个例子,(对你来说这个可能并不是一个很好的指导,在你的代码中去使用)

public static void main(String[] args) {

String username = "username";

String password = "password";

System.out.println(validate(username, password));

}private static boolean validate(String username, String password) {boolean isUsernameValid = username!=null && !username.isEmpty() && username.length() > 3;boolean isPassword = password!=null && !password.isEmpty() && password.length() > 3;return isUsernameValid && isPassword;}

private static boolean isValid = true;

private static boolean validate(String username, String password) {Observable.just(username, password).subscribe(s -> {

if (!(s != null && !s.isEmpty() && s.length() > 3))

throw new RuntimeException();

}, throwable -> isValid = false);

return isValid;

}

2 from

我有很多的api 可以将更加复杂的数据结构转化成为被观察者 如下所示开始关键字

我觉得这些api的名字就能够说明一切并不需要过多的解释,所以我将给你一些例子 这样你将会用的很舒服

public static void main(String[] args) {

List tasks = Arrays.asList(new Tasks(1,"description"),

new Tasks(2,"description"),new Tasks(4,"description"),

new Tasks(3,"description"),new Tasks(5,"description"));Observable.fromIterable(tasks).forEach(task -> System.out.println(task.toString()));}

private static class Tasks {

int id;String description;

public Tasks(int id, String description) {this.id = id;this.description = description;}

@Override

public String toString() {return "Tasks{" + "id=" + id + ", description='" + description + '\'' + '}';}

}

}

数组

public static void main(String[] args) {

Integer[] values = {1,2,3,4,5};

Observable.fromArray(values)

.subscribe(v-> System.out.print(v+" "));

}

这两个例子足够了。其他的你可以试着去写

3 creat

如果你想要定义个被观察者 你可以试着去定义一个

这个api可以给你很大的力量,但是在我看来 在使用这个之前 你可以去尝试其他的解决方法。因为我有99%你能够从其他的api中找到解决方法。如果不能的话那么你可以使用这个

public static void main(String[] args) {

final int a = 3, b = 5, c = 9;

Observable me = Observable.create(new ObservableOnSubscribe() {

@Override

public void subscribe(ObservableEmitter observableEmitter) throws Exception {

observableEmitter.onNext(a);

observableEmitter.onNext(b);

observableEmitter.onNext(c);

observableEmitter.onComplete();

}

});

me.subscribe(i-> System.out.println(i));

}

4. range():

他就像一个efor循环一个 如下所示

public static void main(String[] args) {

Observable.range(1,10)

.subscribe(i-> System.out.print(i+" "));

}

Output:

1 2 3 4 5 6 7 8 9 10

一个真实的例子

public static void main(String[] args) {

List names = Arrays.asList("Hafiz", "Waleed", "Hussain", "Steve");

for (int i = 0; i < names.size(); i++) {if(i%2 == 0)continue;System.out.println(names.get(i));

}Observable.range(0, names.size()).filter(index->index%2==1).subscribe(index -> System.out.println(names.get(index)));

}

5. interval():

这真是一个很棒的

我给你们看一个例子,你们可以比较两种方法。对于第一个,我使用了一个Java线程,第二个使用了我自己的interval()API,两者都有相同的结果。

public static void main(String[] args) {

new Thread(() -> {

try {

sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

greeting();

}).start();Observable.interval(0,1000, TimeUnit.MILLISECONDS).subscribe(aLong -> greeting());}

public static void greeting(){

System.out.println("Hello");

}

6 timer();

一个良好的API。在程序中,如果我想在一秒钟后调用某个东西,我可以使用如下所示的定时器。

public static void main(String[] args) throws InterruptedException {Observable.timer(1, TimeUnit.SECONDS).subscribe(aLong -> greeting());

Thread.sleep(2000);

}

public static void greeting(){

System.out.println("Hello");

}

7. empty():

虽然被嘲笑但是真的特别有用

它创造了一个被观察者 并且不发射任何东西

public static void main(String[] args) throws InterruptedException {

hey(false).subscribe(o -> System.out.println(o));

}

private static Observable hey(boolean isMock) {

returnisMock?Observable.empty():Observable.just(1, 2, 3, 4);

}

7. defer():

在很多情况下,这是非常有用的。我将用一个例子来解释这个问题,如下所示。

public static void main(String[] args) throws InterruptedException {

Employee employee = new Employee();

employee.name = "Hafiz";employee.age = 27;Observable observable = employee.getObservable();employee.age = 28;observable.subscribe(s-> System.out.println(s));}

private static class Employee{

String name;

int age;

Observable getObservable(){

return Observable.just(name, age);

}

}

上述代码的输出将是什么。如果你的答案是28岁,那你就错了。通常被观察的创建方法获取到的值在创建的时候就已经得到了。就像我做输出一样,我将得到27,因为我在27岁的时候创造了一个可观察的结果,之后我改变到28,但是已经可以观察到。那么解决方案是什么呢?是的,您可以使用延迟API。这是真的很有帮助。当你使用延迟的时候基本上只有在你订阅的时候才会出现的情况,所以它的意思是通过使用这个,我将得到我的预期结果。

Observable getObservable(){

//return Observable.just(name, age);return Observable.defer(()-> Observable.just(name, age));}

8error

对来生成错误信号很有用,在我们讨论观察者和他的方法的时候我在和你分享

9. never():

这个api什么都不发送

me:wow谢谢你rx z这真是一个很棒并且很长的答案,我将把它当作我的一个备忘录 , 你可以吧任何函数转化被观察者

public static void main(String[] args) throws InterruptedException {

System.out.println(scale(10,4));Observable.just(scale(10,4)).subscribe(value-> System.out.println(value));}

private static float scale(int width, int height){

return width/height*.3f;

}

me:哇,你真厉害。现在,我想问你关于map filter,等操作的问题。但是如果你想和我分享关于被观察者的创建。由于缺乏知识,我无法向你请教,请与我分享。

rx:有很多。但是我想我可以在这里解释两种不同的观测值。一种叫做冷观察,第二种叫做热观察。在寒冷的…

你可能感兴趣的:(Rxjava2~学渣带你扣rxjava2~ 译文(原创翻译))