13. Challenges
4 Captive Portals
4 Network handover
4 Temporary network loss
4 Timeouts
4 2G Voice and Data
4 Local Storage
4 Request Serialization
4 ...and more
14. Detecting connectivity
boolean isNetworkAvailable() {
ConnectivityManager mgr = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = mgr.getActiveNetworkInfo();
return networkInfo != null && networkInfo.isConnected();
}
4 Checks network state right now
4 Captive portals detection (since API level 17)
4 Poor networks (since API level 16)
4 Must be called before every network operation
4 Will indicate DISCONNECTED if background data is disabled!
15. Listen for changes
private void setupNetworkChangeListener() {
IntentFilter intentFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
this.networkStateReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager mgr = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = mgr.getActiveNetworkInfo();
notifyNetworkState(networkInfo != null && networkInfo.isConnected());
}
};
registerReceiver(networkStateReceiver, intentFilter);
}
4 Continously listen for network state changes
4 Remember to unregister!
24. Response Times:
The 3 Important Limits
4 0.1 seconds - system is reacting instantaneously
4 1.0 seconds - limit for user's flow of thought to stay uninterrupted
4 10 seconds - limit for keeping the user's attention
...response time guidelines for web-based applications are the same as for all
other applications...
— Jakob Nielsen, http://www.nngroup.com/articles/response-times-3-
important-limits/
25. Timeout for HttpURLConnection
URL url = new URL(url);
HttpURLConnection urlConnection = url.openConnection();
urlConnection.setConnectTimeout(CONNECTION_TIMEOUT);
urlConnection.setReadTimeout(CONNECTION_TIMEOUT);
26. Timeout for OkHttpClient
OkHttpClient client = new OkHttpClient();
client.setConnectTimeout(CONNECTION_TIMEOUT);
client.setReadTimeout(CONNECTION_TIMEOUT);
41. Load from cache or network?
// Our sources (left as an exercise for the reader)
Observable<Data> memory = ...;
Observable<Data> disk = ...;
Observable<Data> network = ...;
// Retrieve the first source with data
Observable<Data> source = Observable
.concat(memory, disk, network)
.first();
4 Dan Lew, http://blog.danlew.net/2015/06/22/loading-data-from-
multiple-sources-with-rxjava/
42. Preload data for offline
4 Assets or Raw resources (100 MB)
4 APK Expansion files (2 * 2GB)
4 Download at first startup (unlimited)