Thiết lập ReactiveX trong Android và Áp dụng cho màn hình Splash screen

Để sử dụng được ReactiveX trong Android đơn giản chúng ta chỉ cần include thư viện đó vào project của chúng ta. Bài này tôi giả sử các bạn đã biết qua về lập trình android, nếu các bạn chưa biết có thể học ở đây Lập trình Android

Vào file app/build.gradle và các bạn thêm 2 dòng dưới đây trong phần
dependencies:

dependencies {
//...
compile 'io.reactivex:rxandroid:1.2.1'
compile 'io.reactivex:rxjava:1.1.6'
//...
}

Sau đây tôi sẽ nói về cách áp dụng cho màn hình splash screen.
Trước tiên tôi sẽ phân tích cách truyền thống và sự phức tạp của nó.
Giả sử chúng ta có 1 màn hình splash screen được hiển thị và sau 3 giây sẽ chuyển sang màn hình main screen, dưới đây là mã code mà chúng ta thường dùng:

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
   //...
   new Handler().postDelayed(new Runnable() {
     @Override
     public void run() {
       goToMainScreen();
     }
     }, 3*1000);
    //...
}

Câu hỏi đặt ra là nếu chưa đến 3 giây người dùng nhấn nút close app (đóng màn hình splash screen) thì điều gì sẽ sảy ra. như các bạn thấy, rõ ràng khi đó sau 3 giây hàm goToMainScreen() vẫn được gọi như thường và màn hình main screen vẫn sẽ hiển thị mặc dù chúng ta đã close app.

Để giải quyết vấn đề trên ta thường phải dùng 1 biến tạm và kiểm tra xem có tiếp tục vào màn hình main hay không, đoạn code trên sẽ như sau:

private boolean mIsFinished;
new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {
      if(!mIsFinished) {
      goToMainScreen();
    }
   }
}, 3*1000);

@Override
protected void onDestroy() {
 mIsFinished = true;
 super.onDestroy();
}

Nếu các bạn để ý, chúng ta đã thêm 1 biến  mIsFinished và phải điều khiển logic dựa vào biến đó.

Giờ tôi sẽ giới thiệu việc thay thế đoạn mã code trên bằng RxJava trong android.
Các bạn xem đoạn code dưới đây:

private Subscription subscription;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
subscription =
    Observable.just(0).delay(3, TimeUnit.MILLISECONDS)
     .observeOn(AndroidSchedulers.mainThread())
     .subscribeOn(Schedulers.newThread())
     .subscribe(new Action1() {
       @Override
       public void call(Integer integer) {
       goToMainScreen();
       }
      });
}

@Override
protected void onDestroy() {
    super.onDestroy();
    subscription.unsubscribe();
}

Các bạn thấy, việc điều khiển logic khi mà user đã đóng app ngay lúc màn hình splash không ảnh hưởng gì đến chỗ gọi goToMainScreen() do chúng ta đã hủy callback (observer) ở trong hàm onDestroy.

So sánh 2 cách viết ở trên rõ ràng dùng RxJava đơn giản hơn nhiều.

Các bài sau tôi sẽ đi chi tiết hơn về từng hàm trong RxJava và cách áp dụng chúng. mời các bạn rõi theo.

Tác giả: Lê Trung Thu

Advertisements

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Đăng xuất / Thay đổi )

Connecting to %s