ReactiveNetwork
Android library listening network connection state and Internet connectivity with RxJava Observables
Install / Use
/learn @pwittchen/ReactiveNetworkREADME
ReactiveNetwork
view website with documentation: RxJava1.x, RxJava2.x
ReactiveNetwork is an Android library listening network connection state and Internet connectivity with RxJava Observables. It's a successor of Network Events library rewritten with Reactive Programming approach. Library supports both new and legacy network monitoring strategies. Min sdk version = 9.
| Current Branch | Branch | Artifact Id | Build Status | Coverage | Maven Central |
|:--------------:|:-------:|:-----------:|:-------------:|:--------:|:-------------:|
| | RxJava1.x | reactivenetwork | |
|
|
| :ballot_box_with_check: |
RxJava2.x | reactivenetwork-rx2 | |
|
|
Contents
- Usage
- Integration with other libraries
- Examples
- Download
- Tests
- Code style
- Static code analysis
- Who is using this library?
- Getting help
- Caveats
- Changelog
- JavaDoc
- Documentation
- Releasing
- Contributors
- References
- Supporters
- License
Usage
Please note: Due to memory leak in WifiManager reported
in issue 43945 in Android issue tracker
it's recommended to use Application Context instead of Activity Context.
Observing network connectivity
We can observe Connectivity with observeNetworkConnectivity(context) method in the following way:
ReactiveNetwork
.observeNetworkConnectivity(context)
.subscribeOn(Schedulers.io())
... // anything else what you can do with RxJava
.observeOn(AndroidSchedulers.mainThread())
.subscribe(connectivity -> {
// do something with connectivity
// you can call connectivity.state();
// connectivity.type(); or connectivity.toString();
});
When Connectivity changes, subscriber will be notified. Connectivity can change its state or type.
Errors can be handled in the same manner as in all RxJava observables. For example:
ReactiveNetwork
.observeNetworkConnectivity(context)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
connectivity -> /* handle connectivity here */,
throwable -> /* handle error here */
);
We can react on a concrete state, states, type or types changes with the filter(...) method from RxJava, hasState(NetworkInfo.State... states) and hasType(int... types) methods located in ConnectivityPredicate class.
ReactiveNetwork
.observeNetworkConnectivity(context)
.subscribeOn(Schedulers.io())
.filter(ConnectivityPredicate.hasState(NetworkInfo.State.CONNECTED))
.filter(ConnectivityPredicate.hasType(ConnectivityManager.TYPE_WIFI))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(connectivity -> {
// do something
});
observeNetworkConnectivity(context) checks only connectivity with the network (not Internet) as it's based on BroadcastReceiver for API 20 and lower and uses NetworkCallback for API 21 and higher.
Concrete WiFi or mobile network may be connected to the Internet (and usually is), but it doesn't have to.
You can also use method:
Observable<Connectivity> observeNetworkConnectivity(Context context, NetworkObservingStrategy strategy)
This method allows you to apply your own network observing strategy and is used by the library under the hood to determine appropriate strategy depending on the version of Android system.
Connectivity class
Connectivity class is used by observeNetworkConnectivity(context) and observeNetworkConnectivity(context, networkObservingStrategy) methods. It has the following API:
Connectivity create()
Connectivity create(Context context)
NetworkInfo.State state()
NetworkInfo.DetailedState detailedState()
int type()
int subType()
boolean available()
boolean failover()
boolean roaming()
String typeName()
String subTypeName()
String reason()
String extraInfo()
// and respective setters
class Builder
Network Observing Strategies
Right now, we have the following strategies for different Android versions:
LollipopNetworkObservingStrategyMarshmallowNetworkObservingStrategyPreLollipopNetworkObservingStrategy
All of them implements NetworkObservingStrategy interface.
Concrete strategy is chosen automatically depending on the Android version installed on the device.
With observeNetworkConnectivity(context, strategy) method we can use one of these strategies explicitly.
Observing Internet connectivity
Observing Internet connectivity continuously
We can observe connectivity with the Internet continuously in the following way:
ReactiveNetwork
.observeInternetConnectivity()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(isConnectedToInternet -> {
// do something with isConnectedToInternet value
});
An Observable will return true to the subscription (disposable) if device is connected to the Internet and false if not.
Internet connectivity will be checked as soon as possible.
Please note: This method is less efficient than observeNetworkConnectivity(context) method, because in default observing strategy, it opens socket connection with remote host (default is www.google.com) every two seconds with two seconds of timeout and consumes data transfer. Use this method if you really need it. Optionally, you can dispose subscription (disposable) right after you get notification that Internet is available and do the work you want in order to decrease network calls.
Methods in this section should be used if they are really needed due to specific use cases.
If you want to customize observing of the Internet connectivity, you can use InternetObservingSettings class and its builder.
They allow to customize monitoring interval in milliseconds, host, port, timeout, initial monitoring interval, timeout, expected HTTP response code, error handler or whole observing strategy.
InternetObservingSettings settings = InternetObservingSettings.builder()
.initialInterval(initialInterval)
.interval(interval)
.host(host)
.port(port)
.timeout(timeout)
.httpResponse(httpResponse)
.errorHandler(testErrorHandler)
.strategy(strategy)
.build();
ReactiveNetwork
.observeInternetConnectivity(settings)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(isConnectedToInternet -> {
// do something with isConnectedToInternet value
});
These methods are created to allow the users to fully customize the library and give them more control.
Please note, not all parameters are relevant for all strategies.
For more details check JavaDoc at: http://pwittchen.github.io/ReactiveNetwork/javadoc/RxJava2.x
Checking Internet Connectivity once
If we don't want to observe Internet connectivity in the interval with Observable<Boolean> observeInternetConnectivity(...) method,
we can use Single<Boolean> checkInternetConnectivity(), which does the same thing, but only once.
It may be helpful in the specific use cases.
Single<Boolean> single = ReactiveNetwork.checkInternetConnectivity();
single
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(isConnectedToInternet -> {
// do something with isConnectedToTheInternet
});
As in the previou
