0

Voici ce que je veux atteindre:Planifier un emploi lorsque Internet va avec Android O

  1. état du réseau de surveillance en arrière-plan.
  2. Lorsque l'appareil n'a pas Internet.
  3. Déclencher un travail.

Currently Je vois, il n'y a pas possibilité de déclencher un emploi lorsque l'appareil passe à l'état « Non Internet ». Une solution de contournement ou des solutions?

Note: Je ne préférerais pas surveiller la connectivité Internet de l'appareil via un service de premier plan.

+0

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

+0

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

+0

Répondre avec la même chose que j'utilise. –

Répondre

0

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 
+0

Merci pour le code. Mais cela va s'exécuter sur le thread 'main'. Ce que je vais faire, c'est plutôt de l'exécuter sur un thread de travail séparé. Je suppose qu'il n'y a pas d'autre moyen que la vérification périodique du réseau –

+0

Exactement comme quoi que vous fassiez, utilisez un minuteur ou un gestionnaire d'alarme ou un gestionnaire car il n'y a rien de tel que NetworkStateChangeListener, le meilleur est Handler si le délai est inférieur à 10 minutes. –

+0

@Shaileshmota Je viens de regarder dans les références Android et trouvé [this] (https://developer.android.com/reference/android/telephony/PhoneStateListener.html#onDataConnectionStateChanged (int)), cela peut être utile. –