Android Offline Solicitar con Volley

Quiero dar a mi usuario una experiencia de usuario mucho mejor offline, por lo tanto, quiero construir un Service que almacena todos POST , DELETE , PUT ( GET no tiene sentido porque una llamada GET sin red es una llamada caché) Y enviarlos al servidor tan pronto como el usuario tenga una conexión a Internet. Quiero que sea persistente: incluso si se cancela la aplicación, se envían los datos para no tener inconstancias entre la caché y los datos del servidor.

Estoy bastante familiarizado con Google Volley y Android Networking API -> Sé cómo detectar que no hay red, cómo pre-buscar datos, para almacenar en caché, etc …

Pero ¿hay una esencia o una biblioteca sobre este tema? Sé que la última versión de Facebook implementa un sistema de este tipo, pero me pregunto cómo lo hicieron (quiero decir, sé que están usando un Service pero cómo lo hicieron exactamente, no tengo ni idea!). ¿Alguien tiene idea sobre eso, cualquier experiencia?

Necesita utilizar un BroadcastReceiver para escuchar los eventos de cambio de red. Defina un broadcastReciver en su AndroidManifest.xml con la acción siguiente.

 <receiver android:name=".NetworkBroadcastReceiver" > <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> </intent-filter> </receiver> 

También agregue los siguientes permisos también a su archivo de manifiesto:

 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> 

NetworkBroadcastReceiver –

 public class NetworkBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(final Context context, final Intent intent) { if(isInternetConnected(context)) { //Do something ie trigger an API call or start a IntentService etc. } } public boolean isInternetConnected(Context context) { ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); return activeNetworkInfo != null && activeNetworkInfo.isConnected(); } } 

Eso es todo lo que necesitas hacer para hacer una solicitud tan pronto como consigas Internet.

Para almacenar en caché los datos, te aconsejo analizar la respuesta del servidor y mantenerla en tu base de datos para uso sin conexión. Cada vez que haga una solicitud exitosa, guarde los nuevos datos en la base de datos y deseche la antigua. Cuando el usuario inicia la aplicación, cargue primero los datos de la base de datos y luego active la solicitud Volley, si la solicitud se convierte en exitosa, cargue los datos nuevos en la aplicación, guárdelos en la base de datos y deshágase de la antigua. Así que en caso de que si la solicitud falla, el usuario podrá ver los datos antiguos de la solicitud anterior satisfactoria.

Para manejar la inconsistencia entre los datos en la aplicación y el servidor, es necesario utilizar SyncAdapter. SyncAdapter proporciona un gran soporte para la sincronización periódica en el fondo. Simplemente coloque el código de sincronización en el método onPerformSync () de SyncAdapter. Puede que no funcione en dos situaciones siguientes: 1. Si el usuario no está conectado a Internet 2. Si el dispositivo del usuario está desactivado

Para manejar estos escenarios, utilice el BroadCastReceiver que expliqué anteriormente en mi respuesta para activar el SyncAdapter. También agregue las siguientes acciones a su receptor dentro de AndroidManifest.xml para escuchar el evento de arranque completo del dispositivo.

 <action android:name="android.intent.action.BOOT_COMPLETED" /> <action android:name="android.intent.action.QUICKBOOT_POWERON" /> 

Déjeme saber si necesita más explicación en profundidad con ejemplo de codificación. Espero eso ayude

Echa un vistazo a esta biblioteca que me encontré – Android Priority Job Queue .

Usted define sus tareas de fondo como Jobs y las enhebra a su instancia de JobManager. Job Manager se encargará de la priorización, persistencia, equilibrio de carga, retraso, control de red, agrupación, etc También proporciona un ciclo de vida agradable para sus trabajos para proporcionar una experiencia de usuario mejor y más consistente.

Además, supervisan la conectividad de red. Cuando un dispositivo está sin conexión, los trabajos que requieran conexión de red no se ejecutarán hasta que se restablezca la conectividad de red.

Tal vez hacer un método de validación de redes:
1. Compruebe la conexión de red
SÍ:
A) hacer la solicitud de volea
B) analizar el adaptador de la solicitud de volley
C) y guardar el json en un archivo privado

NO:
A) leer el archivo privado
B) hacer que el adaptador del archivo json sea descargado.

********************** por ejemplo

  if(isconnect){ JsonArrayRequest Req = new JsonArrayRequest(url, new Response.Listener<JSONArray>() { public void onResponse(JSONArray response) { //this the request of your http request Log.d(TAG, response.toString()); // Parsing json for (int i = 0; i < response.length(); i++) { try { ......adapter etc etc } adapter.notifyDataSetChanged(); //here write the httprequest (json file) in local memory try { String textjson= response.toString(); fos = context.openFileOutput("request.json",MODE_PRIVATE); fos.write(textjson.getBytes("ISO-8859-1")); //encode fos.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } swipeRefreshLayout.setRefreshing(false); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { // VolleyLog.d(TAG, "Error: " + error.getMessage()); } }); AppController.getInstance().addToRequestQueue(movieReq); } else{ //noconnection(); in the noconnection method u can parse the listview/recyclerview from json file to make the offline mode } }else{ //parse the listview/recyclerview from local file. } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.