Voici ce que vous pouvez utiliser où vous voulez mais rappelez-vous qu'il doit être démarré au moins une fois, ce qui signifie soit mettre cela dans un onCreate
ou si dans une méthode, puis appeler la méthode au moins une fois.
Handler handler = new Handler();
int timeDelay = 5000; //5 seconds
handler.postDelayed(new Runnable(){
public void run(){
if(!isOnline)
{
yourMethodCall();
}
handler.postDelayed(this, timeDelay);
}
}, delay);
public boolean isOnline() throws InterruptedException, IOException {
String command = "ping -c 1 google.com";
return (Runtime.getRuntime().exec(command).waitFor() == 0);
}
C'est le code qui vérifiera TRAVAILLEZ connexion Internet pour toutes les 5 secondes et si la connexion ne fonctionne pas, alors il appellera votre méthode en elle. Notez également que le code du gestionnaire doit être placé dans une méthode et que isOnline() est une méthode.
Travailler ici est mis en surbrillance parce que la façon la plus courante de vérifier la connexion Internet est vraie si un WiFi est connecté sans Internet (essentiellement un hotspot sans Internet). Mais comme vous ne voulez vérifier aucune connexion, vous pouvez aussi utiliser ce code.
private boolean isNetworkAvailable() {
ConnectivityManager connectivityManager
= (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}
Mais si vous utilisez cette façon, vous devrez déclarer une autorisation dans AndroidManifest.xml qui est <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
utiliser, il fonctionne très bien.
Et oui, il fonctionnera en arrière-plan. Pas un problème dans mon application, mais certains utilisateurs ont signalé que la méthode isOnline()
qui utilise ping pour vérifier la connexion peut parfois geler le thread en cas de pas de ping reçu pendant 5 secondes. Donc, si cela arrive avec vous, vous devrez utiliser la méthode isNetworkAvailable() jusqu'à ce que isOnline()
soit meilleur.
EDIT-
Lorsque l'on regarde dans Android References, je trouve ceci: void onDataConnectionStateChanged (int state)
Cela peut être utilisé pour déterminer le changement d'état du réseau. états par défaut sont:
DATA_DISCONNECTED
DATA_CONNECTING
DATA_CONNECTED
DATA_SUSPENDED
Je sais que vous avez déjà dit que vous ne préféreriez pas les services de premier plan, mais Pourriez-vous en utilisant pour chaque minute ou 10 minutes postDelayed d'un gestionnaire pour vérifier si l'Internet est connecté ou non et si déconnecté alors un appel de méthode. –
'Un gestionnaire vous permet d'envoyer et de traiter des objets Message et Runnable associés à MessageQueue' d'un thread. Un gestionnaire est donc associé à un thread. Quel fil dois-je faire avec ce contrôle périodique? Si je fais une telle opération sur le fil 'main' ne serait-ce pas un abus de ressources? Pour obtenir un contrôle précis, je pourrais même avoir besoin d'effectuer de telles vérifications périodiques toutes les 5 secondes environ. –
Répondre avec la même chose que j'utilise. –