2016-08-30 2 views
0

Je suis un peu confus pour le moment. Quelle est la méthode "correcte"/"optimale" pour un fonctionnement quotidien du réseau dans une application Android? pseudocode:Manière optimale pour un fonctionnement quotidien du réseau

If newDay 
    HTTP Request to server 
    If responseOfRequest equals something 
     Do something 
    If HTTP Request is unsuccessfull (no internet, server down, ...) 
     Try again in 1 hour 

Comment puis-je y parvenir? Je pensais à un JobService mais mon minSDK est inférieure à 5. Android

Cheers, DDerTyp

+0

vous voulez exécuter le code ci-dessus tous les jours ?? –

+0

ouais. C'est pourquoi j'ai écrit "If newDay" -> si c'est un nouveau jour, la requête http devrait être exécutée et ainsi de suite. – jdstaerk

+2

Le gestionnaire d'alarme et le service est tout ce dont vous avez besoin. Il est disponible auprès de l'API 1 – MRX

Répondre

1

Qu'est-ce que vous avez besoin est un un service pour exécuter la logique en arrière-plan et une alarme .

Un peu de théorie première:

https://developer.android.com/training/scheduling/alarms.html#tradeoffs

Une alarme à répétition est un mécanisme relativement simple avec une flexibilité limitée. Ce n'est peut-être pas le meilleur choix pour votre application, en particulier si vous devez déclencher des opérations réseau. Une alarme mal conçue peut entraîner une décharge de la batterie et entraîner une charge importante sur les serveurs. Si vous possédez le serveur hébergeant les données de votre application, l'utilisation de Google Cloud Messaging (GCM) avec conjointement avec l'adaptateur de synchronisation est une meilleure solution que AlarmManager.

https://developer.android.com/training/sync-adapters/running-sync-adapter.html

Par défaut, toutes les alarmes sont annulées lorsqu'un appareil arrête.

Vous devez configurer l'alarme quelque part dans votre application, au début, mais l'enregistrement d'un drapeau parce que vous ne voulez pas mettre en place cette alarme chaque fois que l'utilisateur ouvre l'application

if (!appSettings.isAlarmSetUp()) { 
    final AlarmManager am = (AlarmManager) context.getSystemService(ALARM_SERVICE); 
    final Intent i = new Intent(context, CustomService.class); 
    final Intent intentNotRepeat = new Intent(context, CustomService.class); 
    final PendingIntent pi = PendingIntent.getService(context, 0, i, 0); 

    am.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + AlarmManager.INTERVAL_HALF_HOUR, AlarmManager.INTERVAL_DAY, pi); 

    appSettings.setAlarmSetUp(true); 
} 

Voici plus d'informations sur les alarmes: https://developer.android.com/training/scheduling/alarms.html#type

Comme vous pouvez le voir, cette alarme se réveille un CustomService, où vous ferez tout votre logique

public class CustomService extends IntentService { 

    public CustomService(String name) { 
     super(name); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     // Request to server 
     client.requestToServer() 
       .subscribe(response -> { 
           // Successful response 
           doSomething(response); 
          } 
         }, 
         error -> { 
           // Error 
           createAlarmInOneHour(); 
         }); 
    } 
}