原创翻译,请勿转载。希望大家一起进步。
简介
当我们学习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:有很多。但是我想我可以在这里解释两种不同的观测值。一种叫做冷观察,第二种叫做热观察。在寒冷的…
网友评论