È necessario utilizzare un BroadcastReceiver per ascoltare gli eventi di modifica della rete. Definisci un broadcastReciver nel tuo AndroidManifest.xml con la seguente azione.
<receiver android:name=".NetworkBroadcastReceiver" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
aggiungere anche le seguenti autorizzazioni, nonché al file manifest -
<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 i.e. 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();
}
}
Questo è tutto quello che dovete fare per fare una richiesta, non appena si ottiene Internet.
Per memorizzare nella cache i dati, ti suggerisco di analizzare la risposta del server e tenerlo nel tuo database per l'utilizzo offline. Ogni volta che fai una richiesta di successo, salva i nuovi dati nel database e scarta quello vecchio. Quando l'utente avvia l'app, carica prima i dati dal database e poi attiva la richiesta Volley, se la richiesta ha avuto successo, carica i nuovi dati nell'app, memorizzali nel database e sbarazzati di quello vecchio. Quindi, nel caso in cui la richiesta non riesca, l'utente sarà comunque in grado di vedere i vecchi dati dalla precedente richiesta riuscita.
Per gestire l'incoerenza tra i dati nell'app e nel server, è necessario utilizzare SyncAdapter. SyncAdapter fornisce un ottimo supporto per la sincronizzazione periodica in background. Inserisci il codice di sincronizzazione nel metodo onPerformSync() di SyncAdapter. Potrebbe non funzionare in seguito a due scenari: 1. Se l'utente non è connesso a Internet 2.Se il dispositivo utente è spento
Per gestire questi scenari, utilizzare BroadCastReceiver che ho spiegato in precedenza nella mia risposta per attivare SyncAdapter. Inoltre aggiungi le seguenti azioni al tuo ricevitore all'interno di AndroidManifest.xml per ascoltare l'evento di avvio del dispositivo completo.
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
Fammi sapere se è necessaria una spiegazione più approfondita con esempio di codifica. Spero che lo aiuti
Informazioni sul servizio persistente, hai letto [questa domanda] (http://stackoverflow.com/questions/4708827/persistent-service) ancora – BNK
Sì, l'ho fatto ma voglio sapere se c'è qualcosa di un po 'meno generico: –
Puoi esaminare la libreria [RobospiceRetrofit] (https://github.com/stephanenicolas/robospice) ... Utilizza i Servizi per inviare la richiesta al server e puoi ottenere i dati dalla cache se l'app non è in linea. Ma penso che il Servizio venga distrutto quando esci dall'app. Spero che aiuti ... –