Maria
Maria

Reputation: 387

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;
        }
    }

Upvotes: 4

Views: 4444

Answers (2)

blackorbs
blackorbs

Reputation: 625

I want to do network call using a method which return a boolean value

First: Import rxjava and rxandroid library: https://github.com/ReactiveX/RxAndroid

Then for single call:

new SingleFromCallable<>(new Callable<Boolean>() { //return type "Boolean" from network call
        @Override
        public Boolean call() {
            return URLIsReachable(searchText); //network call
        }
    })
            .subscribeOn(Schedulers.io()) //run in background thread
            .observeOn(AndroidSchedulers.mainThread()) //handle future response in ui thread
            .subscribe(new SingleObserver<Boolean>() { //start network call
                @Override
                public void onSubscribe(@io.reactivex.rxjava3.annotations.NonNull Disposable d) {}

                @Override
                public void onSuccess(@io.reactivex.rxjava3.annotations.NonNull Boolean isValidUrl) {
                    loadingDialog.dismiss();
                    if(isValidUrl) //do future stuff on main thread
                }

                @Override
                public void onError(@io.reactivex.rxjava3.annotations.NonNull Throwable e) {
                    loadingDialog.dismiss();
                }
            });

Upvotes: 0

Anggrayudi H
Anggrayudi H

Reputation: 15155

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() {

            }
        });

Upvotes: 8

Related Questions