12/08/2018, 14:45

Combination of RxJava and Sqlite

Một trong những nguyên tắc thiết kế quan trọng trên Android là không bao giờ thực hiện I/O trên main thread, và cụ thể trong trường hợp này là truy cập vào cơ sở dữ liệu Sqlite. RxJava hiện đang là xu hướng lập trình vì những lợi ích mà nó mang lại nên việc chọn RxJava để kết hợp với Sqlite là một ...

Một trong những nguyên tắc thiết kế quan trọng trên Android là không bao giờ thực hiện I/O trên main thread, và cụ thể trong trường hợp này là truy cập vào cơ sở dữ liệu Sqlite. RxJava hiện đang là xu hướng lập trình vì những lợi ích mà nó mang lại nên việc chọn RxJava để kết hợp với Sqlite là một lựa chọn hoàn hảo thay vì thread pool, asyntask,...

Tạm ví dụ một ví dụ nhỏ là get dữ liệu của User từ database.

Ta có một method lấy dữ liệu từ database thông thường mà ta vẫn thường hay call:

public List<User> retrieveDataOfAllUser() {
    // Cursor...
    // select * from User...
    // return list;
}

Tạo một method return về một Callable:

Callable<List<User>> getAllUser() {
  return new Callable<List<User>>() {
    @Override
    public List<User> call() {
        retrieveDataOfAllUser();
    }
  }
}

Cuối cùng là đưa Callable vào Observable, trước hết tạo một method make observable:

private 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 {
              subscriber.onNext(func.call());
              subscriber.onCompleted();
            } catch(Exception ex) {
              subscriber.onError(ex);
            }
          }
    });
}

và dùng nó để make observable mà sử dụng thôi:

Observable<List<User>> getUsers(String userId) {
  return makeObservable(getAllUser())
        .subscribeOn(Schedulers.io()))
        .observeOn(AndroidSchedulers.mainThread());
}

Thật đơn giản và tiện lợi phải không nhỉ, hi vọng sau bài viết bạn có thể áp dụng RxJava để tối ưu hơn khi làm việc với SQLite.

0