Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to observe network changes in RxAndroid

I’m using the code given here.

I put those code blocks as classes in my project’s util package. And then in the main activity class I wrote this..

class MenuActivity {

// Variable declaration
  private final CompositeSubscription mConnectionSubscription = new CompositeSubscription();

@Override
protected void onCreate(Bundle savedInstanceState) {

    // Some initialisation of UI elements done here

    mConnectionSubscription.add(AppObservable.bindActivity(this, NetworkUtils.observe(this)).subscribe(new Action1<NetworkUtils.State>() {
        @Override
        public void call(NetworkUtils.State state) {
            if(state == NetworkUtils.State.NOT_CONNECTED)
                Timber.i("Connection lost");
            else
                Timber.i("Connected");
        }
    }));

}

My goal is to monitor the changes and change a variable MyApp.isConnected defined in the MyApp class statically whenever the network changes to true false. Help would be appreciated. Thank you 😄

like image 408
Saifur Rahman Mohsin Avatar asked Jun 28 '15 10:06

Saifur Rahman Mohsin


1 Answers

You asked me for an answer in another thread. I'm answering late, because I needed some time to develop and test solution, which I find good enough.

I've recently created new project called ReactiveNetwork.

It's open-source and available at: https://github.com/pwittchen/ReactiveNetwork.

You can add the following dependency to your build.gradle file:

dependencies {
  compile 'com.github.pwittchen:reactivenetwork:x.y.z'
}

Then, you can replace x.y.z with the latest version number.

After that, you can use library in the following way:

 ReactiveNetwork.observeNetworkConnectivity(context)        
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(new Action1<ConnectivityStatus>() {
      @Override public void call(Connectivity connectivity) {
        if(connectivity.getState() == NetworkInfo.State.DISCONNECTED) {
          Timber.i("Connection lost");
        } else if(connectivity.getState() == NetworkInfo.State.CONNECTED) {
          Timber.i("Connected");
        }
      }
    });

You can also use filter(...) method from RxJava if you want to react only on a single type of event.

You can create a subscription in onResume() method and then unsubscribe it in onPause() method inside Activity.

You can find more examples of usage and sample app on the website of the project on GitHub.

Moreover, you can read about NetworkInfo.State enum from Android API, which is now used by the library.

like image 121
Piotr Wittchen Avatar answered Nov 15 '22 02:11

Piotr Wittchen