RxJava
ZiziChou
同步
(Synchronous)
異步(Asynchronous)
AsyncTask?Thread?Handler?
簡潔
new Thread() {
@Override
public void run() {
super.run();
for (Folder folder : folders) {
File[] files = folder.listFiles();
for (File file : files) {
if (file.getName().endsWith(".jpg")) {
Bitmap bitmap = getBitmapFromFile(file);
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
galleryView.addImage(bitmap);
}
});
}
}
}
}
}.start();
Observable.from(folders)
.flatMap(new Func1<File, Observable<Folder>>() {
@Override
public Observable<File> call(Folder folder) {
return Observable.from(folder.listFiles());
}
})
.filter(new Func1<File, Boolean>() {
@Override
public Boolean call(File file) {
return file.getName().endsWith(".jpg");
}
})
.map(new Func1<File, Bitmap>() {
@Override
public Bitmap call(File file) {
return getBitmapFromFile(file);
}
})
.subscribe(new Action1<Bitmap>() {
@Override
public void call(Bitmap bitmap) {
galleryView.addImage(bitmap);
}
});
Observable.from(folders)
.flatMap((Func1) (folder) -> { Observable.from(folder.listFiles()) })
.filter((Func1) (file) -> { file.getName().endsWith(".jpg") })
.map((Func1) (file) -> { getBitmapFromFile(file) })
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe((Action1) (bitmap) -> { galleryView.addImage(bitmap) });
Retrolambda(optional)
被觀察者
觀察者
逮補
做壞事
Button
OnClickListener
onClick(View)
被觀察者
觀察者
事件
setOnClickListener()
訂閱
onEvent(params)
被觀察者
觀察者
事件
subscribe
訂閱
Observable
Observer
RxJava
onError
onNext(相當於 onClick / onEvent)
onCompleted
Observer
觀察者
決定事件觸發時將有怎樣的行為
Observer<String> observer = new Observer<String>() {
@Override
public void onNext(String name) {
Log.d(tag, "Item Name: " + name);
}
@Override
public void onCompleted() {
Log.d(tag, "Completed!");
}
@Override
public void onError(Throwable e) {
Log.d(tag, "Error!");
}
};
Observable
被觀察者
決定什麼時候觸發事件以及觸發怎樣的事
Observable observable = Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("Hello");
subscriber.onNext("Hi");
subscriber.onNext("Aloha");
subscriber.onCompleted();
}
});
Operators
運算元
Creating
- create
- from
- just
Transforming
- map
- flatMap
Filtering
Combining
Error Handling
Map
Observable.just("images/mamilove.png") // String
.map(new Func1<String, Bitmap>() {
@Override
public Bitmap call(String filePath) { // String
return getBitmapFromPath(filePath); // Bitmap
}
})
.subscribe(new Action1<Bitmap>() {
@Override
public void call(Bitmap bitmap) { // Bitmap
showBitmap(bitmap);
}
});
flatMap()
Student[] students = ...;
Observable.from(students)
.map(new Func1<Student, String>() {
@Override
public String call(Student student) {
return student.getName();
}
})
.subscribe(new Observer<String>() {
@Override
public void onNext(String name) {
Log.d(tag, name);
}
...
}
);
Student[] students = ...;
Observable.from(students)
.subscribe(new Observer<Student>() {
@Override
public void onNext(Student student) {
List<Course> courses = student.getCourses();
for (int i = 0; i < courses.size(); i++) {
Course course = courses.get(i);
Log.d(tag, course.getName());
}
}
...
}
);
Student[] students = ...;
Observable.from(students)
.flatMap(new Func1<Student, Observable<Course>>() {
@Override
public Observable<Course> call(Student student) {
return Observable.from(student.getCourses());
}
})
.subscribe(new Observer<Course>() {
@Override
public void onNext(Course course) {
Log.d(tag, course.getName());
}
...
}
);
Retrofit
@GET("/user")
public void getUser(@Query("userId") String userId, Callback<User> callback);
getUser(userId, new Callback<User>() {
@Override
public void success(User user) {
userView.setUser(user);
}
@Override
public void failure(RetrofitError error) {
// Error handling
...
}
};
@GET("/user")
public Observable<User> getUser(@Query("userId") String userId);
getUser(userId)
.subscribe(new Observer<User>() {
@Override
public void onNext(User user) {
userView.setUser(user);
}
});
getUser(userId, new Callback<User>() {
@Override
public void success(User user) {
new Thread() {
@Override
public void run() {
processUser(user);
runOnUiThread(new Runnable() {
@Override
public void run() {
userView.setUser(user);
}
});
}).start();
}
};
getUser(userId)
.doOnNext(new Action1<User>() {
@Override
public void call(User user) {
processUser(user);
})
.subscribe(new Observer<User>() {
@Override
public void onNext(User user) {
userView.setUser(user);
}
});
RxJava
By ChouPeiWen
RxJava
tech sharing
- 932