Android-событие для изменения состояния подключения к Интернету

Я делаю приложение, где пользователь загружает информацию и файлы на мой сервер на несколько частых основаниях. Это делается в новых потоках через специализированную службу загрузки.

Я знаю из этой темы

Определите, есть ли доступ к Интернету на Android

Что вы можете проверить, есть ли подключение к Интернету относительно легко. Вы также можете получить socketTimeoutExceptions для обнаружения проблем с подключением к Интернету. Все это хорошо и хорошо, и позволяет мне кэшировать мои загрузки достаточно легко, когда соединение не работает по какой-либо причине.

Мой вопрос, хотя, как я знаю, когда повторно загружать загрузку? Происходит ли событие, вызванное восстановлением соединения? Или я застрял в создании нового потока, который спит, а затем проверяет подключение к Интернету каждые 30 секунд или что-то в этом роде?

Любые идеи были бы хорошы!

Avtar

Solutions Collecting From Web of "Android-событие для изменения состояния подключения к Интернету"

Там есть широковещательный приемник для изменения связи. См. Здесь

Очень старый пост, но я хотел бы поделиться своим получателем

Нет необходимости класть руки на явные или другие скучные ресурсы 🙂

ПРИМЕНЕНИЕ

ВАША ДЕЯТЕЛЬНОСТЬ:

/* * 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 */ } 

ПОЛУЧАТЕЛЬ

Просто скопируйте и вставьте в свой проект как NetworkStateReceiver.java

 public class NetworkStateReceiver extends BroadcastReceiver { protected Set<NetworkStateReceiverListener> listeners; protected Boolean connected; public NetworkStateReceiver() { listeners = new HashSet<NetworkStateReceiverListener>(); 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(); } } 

НАСЛАЖДАТЬСЯ 😉

Если вы просто хотите сделать что-то простое при изменении связи, есть гораздо более простое решение.

В своей деятельности создайте широковещательный приемник:

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

Затем в onResume и onPause выполните регистрацию:

 @Override public void onResume() { super.onResume(); registerReceiver(networkStateReceiver, new IntentFilter(android.net.ConnectivityManager.CONNECTIVITY_ACTION)); } @Override public void onPause() { unregisterReceiver(networkStateReceiver); super.onPause(); } 

Не совсем уверен, что происходило в широковещательном приемнике Tommaso, но это не работало для меня, вот моя реализация. Он уведомляет об изменениях между доступными / недоступными подключениями.

Также я зарегистрирую его в onResume() и onPause() регистрацию в onPause() . В противном случае это то же самое, что и выше.

 public class NetworkStateReceiver extends BroadcastReceiver { private ConnectivityManager mManager; private List<NetworkStateReceiverListener> mListeners; private boolean mConnected; public NetworkStateReceiver(Context context) { mListeners = new ArrayList<NetworkStateReceiverListener>(); 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(); } } 

Android Nougat & O (API 24+) – Сетевое состояние

Изменяет mades на ответ @darnmason (конструктор), чтобы он работал над 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(); }