2015-07-25 6 views
14

voglio dare al mio all'utente un'esperienza utente molto meglio in linea, quindi, voglio costruire un Service che memorizza tutte le POST, DELETE, PUT (GET non ha senso, perché una chiamata GET senza rete è una chiamata alla cache) richiede all'utente di essere offline e di inviarli al server non appena l'utente ottiene una connessione Internet. Voglio che sia persistente: anche se l'app viene uccisa, i dati vengono inviati per non avere incongruenze tra i dati della cache e del server.linea Android richiesta con Volley

Sono abbastanza familiarità con Google Volley e API Networking Android -> So come rilevare non c'è nessuna rete, come i dati prefetch, di cache loro ecc ...

Ma c'è un nocciolo o una biblioteca su questo argomento? So che l'ultima versione di Facebook implementa un tale sistema, ma mi chiedo come abbiano fatto (voglio dire, so che stiamo usando uno Service ma come hanno fatto esattamente, non ne ho idea!). Qualcuno ha un'idea su questo, qualche esperienza?

+0

Informazioni sul servizio persistente, hai letto [questa domanda] (http://stackoverflow.com/questions/4708827/persistent-service) ancora – BNK

+0

Sì, l'ho fatto ma voglio sapere se c'è qualcosa di un po 'meno generico: –

+2

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 ... –

risposta

0

voi forse fare un metodo di validazione di rete:
1. Controllare la connessione di rete
SI:
a) effettuare la richiesta volley
b) analizzare l'adattatore dalla richiesta di volley
c) e salvare il JSON in un file privato

NO:
a) leggere il file privato
b) fare scaricare l'adattatore dal file json.

********************** ad esempio

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. } 
3

È 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

3

Dai un'occhiata a questa libreria che ho trovato - Android Priority Job Queue.

Le attività in background vengono definite come Lavori e accodate all'istanza di JobManager . Job Manager si prenderà cura delle priorità, persistenza, bilanciamento del carico, ritardo, controllo di rete, raggruppamento, ecc. Fornisce anche un ciclo di vita piacevole per i tuoi lavori per offrire un'esperienza utente coerente, coerente.

Inoltre, monitorano la connettività di rete. Quando un dispositivo è offline, i lavori che richiedono una connessione di rete non verranno eseguiti fino a quando non verrà ripristinata la connettività di rete.

+0

Vedo, darò un'occhiata perché quasi scrivo questa libreria per questo bisogno ... #stupid Thx mate –