Je fais une application où un utilisateur télécharge des informations et des fichiers sur mon serveur assez fréquemment. Cela se fait dans de nouveaux threads via un service de téléchargement dédié.
Je sais de ce fil
Détecter s’il existe une connexion Internet disponible sur Android
que vous pouvez vérifier s’il existe une connexion Internet relativement facile. Vous pouvez également obtenir des socketTimeoutExceptions pour détecter les problèmes de connectivité Internet. Tout cela est bien, et me permet de mettre mes téléchargements en cache assez facilement lorsque la connexion ne fonctionne pas pour une raison quelconque.
Ma question est la suivante: comment savoir quand réessayer le téléchargement? Un événement est-il déclenché lorsque la connexion est restaurée? Ou est-ce que je suis coincé à faire un nouveau thread qui dort et vérifie ensuite la connectivité Internet toutes les 30 secondes ou quelque chose?
Toute idée serait appréciée!
Il y a un récepteur de diffusion pour les changements de connectivité. Voir ici
très vieux post mais je voudrais partager mon récepteur
pas besoin de mettre la main sur un manifeste ou d’autres ressources ennuyeuses 🙂
/* * You need to implement NetworkStateReceiverListener. * This interface is described inside the NewtworkStateReceiver class */ public class MyActivity implements NetworkStateReceiverListener { /* ... */ private NetworkStateReceiver networkStateReceiver; }
public void onCreate(Bundle savedInstanceState) { /* ... */ networkStateReceiver = new NetworkStateReceiver(); networkStateReceiver.addListener(this); this.registerReceiver(networkStateReceiver, new IntentFilter(android.net.ConnectivityManager.CONNECTIVITY_ACTION)); } public void onDestroy() { super.onDestroy(); networkStateReceiver.removeListener(this); this.unregisterReceiver(networkStateReceiver); }
@Override public void networkAvailable() { Log.d("tommydevall", "I'm in, baby!"); /* TODO: Your connection-oriented stuff here */ } @Override public void networkUnavailable() { Log.d("tommydevall", "I'm dancing with myself"); /* TODO: Your disconnection-oriented stuff here */ }
public class NetworkStateReceiver extends BroadcastReceiver { protected Set listeners; protected Boolean connected; public NetworkStateReceiver() { listeners = new HashSet (); connected = null; } public void onReceive(Context context, Intent intent) { if(intent == null || intent.getExtras() == null) return; ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo ni = manager.getActiveNetworkInfo(); if(ni != null && ni.getState() == NetworkInfo.State.CONNECTED) { connected = true; } else if(intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY,Boolean.FALSE)) { connected = false; } notifyStateToAll(); } private void notifyStateToAll() { for(NetworkStateReceiverListener listener : listeners) notifyState(listener); } private void notifyState(NetworkStateReceiverListener listener) { if(connected == null || listener == null) return; if(connected == true) listener.networkAvailable(); else listener.networkUnavailable(); } public void addListener(NetworkStateReceiverListener l) { listeners.add(l); notifyState(l); } public void removeListener(NetworkStateReceiverListener l) { listeners.remove(l); } public interface NetworkStateReceiverListener { public void networkAvailable(); public void networkUnavailable(); } }
PRENDRE PLAISIR 😉
Si vous voulez simplement faire quelque chose de simple lorsque la connectivité change, la solution est beaucoup plus simple.
Dans votre activité, créez un récepteur de diffusion:
private BroadcastReceiver networkStateReceiver=new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo ni = manager.getActiveNetworkInfo(); doSomethingOnNetworkChange(ni); } };
Alors dans onResume
et onPause
faites l’enregistrement:
@Override public void onResume() { super.onResume(); registerReceiver(networkStateReceiver, new IntentFilter(android.net.ConnectivityManager.CONNECTIVITY_ACTION)); } @Override public void onPause() { unregisterReceiver(networkStateReceiver); super.onPause(); }
Je ne suis pas sûr de ce qui se passait dans le récepteur de diffusion de Tommaso, mais cela ne fonctionnait pas pour moi, voici ma mise en œuvre. Il avertit uniquement du changement de connectivité disponible / indisponible.
Je l’inscris aussi dans onResume()
et onPause()
dans onPause()
. Sinon, c’est la même chose que ci-dessus.
public class NetworkStateReceiver extends BroadcastReceiver { private ConnectivityManager mManager; private List mListeners; private boolean mConnected; public NetworkStateReceiver(Context context) { mListeners = new ArrayList (); mManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); checkStateChanged(); } public void onReceive(Context context, Intent intent) { if (intent == null || intent.getExtras() == null) return; if (checkStateChanged()) notifyStateToAll(); } private boolean checkStateChanged() { boolean prev = mConnected; NetworkInfo activeNetwork = mManager.getActiveNetworkInfo(); mConnected = activeNetwork != null && activeNetwork.isConnectedOrConnecting(); return prev != mConnected; } private void notifyStateToAll() { for (NetworkStateReceiverListener listener : mListeners) { notifyState(listener); } } private void notifyState(NetworkStateReceiverListener listener) { if (listener != null) { if (mConnected) listener.onNetworkAvailable(); else listener.onNetworkUnavailable(); } } public void addListener(NetworkStateReceiverListener l) { mListeners.add(l); notifyState(l); } public void removeListener(NetworkStateReceiverListener l) { mListeners.remove(l); } public interface NetworkStateReceiverListener { public void onNetworkAvailable(); public void onNetworkUnavailable(); } }
Change mades en @darnmason answer (constructeur) pour le faire fonctionner sur API 24+ .
public NetworkStateReceiver(Context context) { mListeners = new ArrayList<>(); mManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); context.registerReceiver(NetworkStateReceiver.this, intentFilter); checkStateChanged(); }