Search code examples
javaandroidrx-java2

Replace Async Task with RxJava


I have been trying to learn how to use RXJava, I was wondering how can I change the AsyncTask code below and use RXJava, is it possible. I am new to RXJava and since AsyncTask is being deprecated I wanted some help.

 private static class AddTeamAsyncTask extends AsyncTask<Team, Void, Void> {
        private TeamDao teamDao;
         AddTeamAsyncTask(TeamDao teamDao) {
            this.teamDao = teamDao;
        }

        @Override
        protected Void doInBackground(Team... teams) {
            teamDao.addTeam(teams[0]);
            return null;
        }
    }

Solution

  • RxJava is pretty straightforward. You could write that like this:

    private void addTeamInBackground(Team team) {
        Observable.fromCallable(new Callable<Boolean>() {
            @Override
            public Boolean call() throws Exception {
                teamDao.addTeam(team);
                // RxJava does not accept null return value. Null will be treated as a failure.
                // So just make it return true.
                return true;
            }
        }) // Execute in IO thread, i.e. background thread.
            .subscribeOn(Schedulers.io())
            // report or post the result to main thread.
            .observeOn(AndroidSchedulers.mainThread())
            // execute this RxJava
            .subscribe();
    }
    

    Or you can write it in Java 8 Lambda style:

    private void addTeamInBackground(Team team) {
        Observable.fromCallable(() -> {
            teamDao.addTeam(team);
            // RxJava does not accept null return value. Null will be treated as a failure.
            // So just make it return true.
            return true;
        }) // Execute in IO thread, i.e. background thread.
            .subscribeOn(Schedulers.io())
            // report or post the result to main thread.
            .observeOn(AndroidSchedulers.mainThread())
            // execute this RxJava
            .subscribe();
    }
    

    If you care about the result, you can add more callbacks into subscribe() method:

            .subscribe(new Observer<Boolean>() {
                @Override
                public void onSubscribe(Disposable d) {
    
                }
    
                @Override
                public void onNext(Boolean success) {
                    // on success. Called on main thread, as defined in .observeOn(AndroidSchedulers.mainThread())
                }
    
                @Override
                public void onError(Throwable e) {
    
                }
    
                @Override
                public void onComplete() {
    
                }
            });