2015-07-25 14 views
14

Ich möchte einen viel besseren offline User Experience zu meinem Benutzer geben, deshalb mag ich ein Service bauen, die speichert alle POST, DELETE, PUT (GET macht keinen Sinn, weil ein GET Anruf ohne Netzwerk Ein Cache-Aufruf) fordert den Benutzer auf, offline zu gehen und sie an den Server zu senden, sobald der Benutzer eine Internetverbindung hat. Ich möchte, dass es persistent ist: Selbst wenn die App beendet wird, werden Daten gesendet, um Unbeständigkeiten zwischen Cache- und Serverdaten zu vermeiden.Android Offline-Anfrage mit Volley

ich sehr vertraut bin mit Google Volley und Android Networking API -> Ich weiß, wie es zu erkennen ist kein Netzwerk, wie die Daten vorab abzurufen, sie usw. cachen ...

Aber gibt es einen Kern oder eine Bibliothek zu diesem Thema? Ich weiß, dass die neueste Facebook-Version ein solches System implementiert, aber ich frage mich, wie sie das gemacht haben (ich meine, ich weiß, dass es eine Service ist, aber wie sie genau das gemacht haben, hab keine Ahnung!). Hat jemand eine Idee dazu, irgendeine Erfahrung?

+0

Über persistent Service, haben Sie gelesen [diese Frage] (http://stackoverflow.com/questions/4708827/persistent-service) noch – BNK

+0

Ja, ich wollte, aber ich möchte wissen, ob es etwas weniger generische:) –

+2

Sie können in [RobospiceRetrofit] (https://github.com/stephanenicolas/robospice) Bibliothek suchen ... Es verwendet Dienste, um eine Anfrage an den Server zu senden, und Sie können Daten aus dem Cache abrufen, wenn die App offline ist. Aber ich denke, dass der Service zerstört wird, wenn Sie die App verlassen. Hoffe es hilft ... –

Antwort

0

Sie tun vielleicht ein Netzwerkvalidierungsmethode:
1. Überprüfen Sie die Netzwerkverbindung
YES:
a) machen die Volley Anfrage
b) Analysieren Sie den Adapter von Volley Anfrage
c) und die json speichern in eine private Datei
NO:
a) lesen Sie die private Datei
b) machen Sie den Adapter von JSON-Datei heruntergeladen.

********************** zum Beispiel

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

Sie benötigen einen BroadcastReceiver zu verwenden, um zu hören Änderungsereignisse zu vernetzen. Definieren Sie einen BroadcastReciver in Ihrer AndroidManifest.xml mit der folgenden Aktion.

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

Auch die folgenden Berechtigungen auch auf Ihre Manifest-Datei hinzufügen -

<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(); 
    }  
} 

Das ist alles, was Sie tun müssen, um einen Antrag zu machen, sobald Sie bekommen Internet.

Um Daten zwischenzuspeichern, empfehle ich Ihnen, die Serverantwort zu analysieren und in Ihrer Datenbank zur Offline-Verwendung zu speichern. Jedes Mal, wenn Sie eine erfolgreiche Anfrage machen, speichern Sie die neuen Daten in der Datenbank und verwerfen Sie die alte. Wenn der Benutzer die App startet, lade zuerst die Daten aus der Datenbank und dann die Volley-Anfrage, wenn die Anfrage erfolgreich wird, dann lade die neuen Daten in die App, speichere sie in der Datenbank und entferne die alte. Wenn die Anfrage fehlschlägt, kann der Benutzer die alten Daten der vorherigen erfolgreichen Anfrage weiterhin sehen.

Um Inkonsistenzen zwischen Daten in App und Server zu behandeln, müssen Sie SyncAdapter verwenden. SyncAdapter bietet eine großartige Unterstützung für die periodische Synchronisierung im Hintergrund. Fügen Sie einfach den Synchronisierungscode in die onPerformSync() - Methode von SyncAdapter ein. Es funktioniert möglicherweise nicht in folgenden zwei Szenarien - 1. Wenn Benutzer nicht mit dem Internet verbunden ist 2.Wenn das Benutzergerät ausgeschaltet ist

Um dieses Szenario zu behandeln, verwenden Sie den BroadCastReceiver, der oben in meiner Antwort erläutert wurde, um den SyncAdapter auszulösen. Fügen Sie Ihrem Empfänger in AndroidManifest.xml die folgenden Aktionen hinzu, um das Boot-Complete-Ereignis des Geräts anzuhören.

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

Lassen Sie mich wissen, wenn Sie mehr eingehende Erklärung mit Codierungsbeispiel benötigen. Hoffe, es hilft

3

Werfen Sie einen Blick auf diese Bibliothek, die ich stieß - Android Priority Job Queue.

Sie definieren Ihre Hintergrundaufgaben als Jobs und fügen sie in Ihre JobManager-Instanz ein. Job Manager kümmert sich um Priorisierung, Persistenz, Load Balancing, Verzögerung, Netzwerkkontrolle, Gruppierung usw. Es bietet auch einen schönen Lebenszyklus für Ihre Aufträge, um eine bessere, konsistente Benutzererfahrung bereitzustellen.

Sie überwachen auch die Netzwerkkonnektivität. Wenn ein Gerät offline ist, werden Aufträge, für die eine Netzwerkverbindung erforderlich ist, nicht ausgeführt, bis die Netzwerkverbindung wiederhergestellt ist.

+0

Ich sehe, ich werde einen Blick geben, weil ich fast diese Lib für dieses Bedürfnis schreibe ... #stupid Thx mate –