I am working on an application that needs to communicate with the server. Hence, the check for the internet connectivity is implemented.
The check works perfectly fine when I am working with mobile data and wifi.
The issue is my device is connected with hotspot. I click on the login button and get the progress bar that states "Connecting to the server". Now, I turn off the hotspot. But the wifi is enabled in my device.
(It simply fails to get any responseCode).
My application gets into the infinite state.
Any suggestions of how to overcome this problem.
You can go this way too:
Create two java files in your package:NetworkConnectivity.java
and NetworkMonitorListener.java
as below:
NetworkConnectivity.java:
public class NetworkConnectivity {
private static NetworkConnectivity sharedNetworkConnectivity = null;
private Activity activity = null;
private final Handler handler = new Handler();
private Runnable runnable = null;
private boolean stopRequested = false;
private boolean monitorStarted = false;
private static final int NETWORK_CONNECTION_YES = 1;
private static final int NETWORK_CONNECTION_NO = -1;
private static final int NETWORK_CONNECTION_UKNOWN = 0;
private int connected = NETWORK_CONNECTION_UKNOWN;
public static final int MONITOR_RATE_WHEN_CONNECTED_MS = 5000;
public static final int MONITOR_RATE_WHEN_DISCONNECTED_MS = 1000;
private final List<NetworkMonitorListener> networkMonitorListeners = new ArrayList<NetworkMonitorListener>();
private NetworkConnectivity() {
}
public synchronized static NetworkConnectivity sharedNetworkConnectivity() {
if (sharedNetworkConnectivity == null) {
sharedNetworkConnectivity = new NetworkConnectivity();
}
return sharedNetworkConnectivity;
}
public void configure(Activity activity) {
this.activity = activity;
}
public synchronized boolean startNetworkMonitor() {
if (this.activity == null) {
return false;
}
if (monitorStarted) {
return true;
}
stopRequested = false;
monitorStarted = true;
(new Thread(new Runnable() {
@Override
public void run() {
doCheckConnection();
}
})).start();
return true;
}
public synchronized void stopNetworkMonitor() {
stopRequested = true;
monitorStarted = false;
}
public void addNetworkMonitorListener(NetworkMonitorListener l) {
this.networkMonitorListeners.add(l);
this.notifyNetworkMonitorListener(l);
}
public boolean removeNetworkMonitorListener(NetworkMonitorListener l) {
return this.networkMonitorListeners.remove(l);
}
private void doCheckConnection() {
if (stopRequested) {
runnable = null;
return;
}
final boolean connectedBool = this.isConnected();
final int _connected = (connectedBool ? NETWORK_CONNECTION_YES
: NETWORK_CONNECTION_NO);
if (this.connected != _connected) {
this.connected = _connected;
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
notifyNetworkMonitorListeners();
}
});
}
runnable = new Runnable() {
@Override
public void run() {
doCheckConnection();
}
};
handler.postDelayed(runnable,
(connectedBool ? MONITOR_RATE_WHEN_CONNECTED_MS
: MONITOR_RATE_WHEN_DISCONNECTED_MS));
}
public boolean isConnected() {
try {
ConnectivityManager cm = (ConnectivityManager) activity
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
if (netInfo != null && netInfo.isConnected()) {
return true;
} else {
return false;
}
} catch (Exception e) {
return false;
}
}
private void notifyNetworkMonitorListener(NetworkMonitorListener l) {
try {
if (this.connected == NETWORK_CONNECTION_YES) {
l.connectionEstablished();
} else if (this.connected == NETWORK_CONNECTION_NO) {
l.connectionLost();
} else {
l.connectionCheckInProgress();
}
} catch (Exception e) {
}
}
private void notifyNetworkMonitorListeners() {
for (NetworkMonitorListener l : this.networkMonitorListeners) {
this.notifyNetworkMonitorListener(l);
}
}
}
NetworkMonitorListener.java:
public interface NetworkMonitorListener {
public void connectionEstablished();
public void connectionLost();
public void connectionCheckInProgress();
}
And at last, use this class in your activity as below, say for example:
NetworkConnectivity.sharedNetworkConnectivity().configure(this);
NetworkConnectivity.sharedNetworkConnectivity().startNetworkMonitor();
NetworkConnectivity.sharedNetworkConnectivity()
.addNetworkMonitorListener(new NetworkMonitorListener() {
@Override
public void connectionCheckInProgress() {
// Okay to make UI updates (check-in-progress is rare)
}
@Override
public void connectionEstablished() {
// Okay to make UI updates -- do something now that
// connection is avaialble
}
@Override
public void connectionLost() {
// Okay to make UI updates -- bummer, no connection
}
});
With this way, you can check internet connection in real time, and act accordingly.
public class checkconnection {
public static boolean checkInternetConnection(Context context) {
boolean haveConnectedWifi = false;
boolean haveConnectedMobile = false;
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
try {
NetworkInfo[] netInfo = cm.getAllNetworkInfo();
for (NetworkInfo ni : netInfo) {
if (ni.getTypeName().equalsIgnoreCase("WIFI"))
if (ni.isConnected())
haveConnectedWifi = true;
if (ni.getTypeName().equalsIgnoreCase("MOBILE"))
if (ni.isConnected())
haveConnectedMobile = true;
}
} catch (Exception e) {
e.getStackTrace();
}
return haveConnectedWifi || haveConnectedMobile;
}
}
Use the following checkInternetConnection()
method in your class before you call the login. true
ensures that you have connectivity.
Try out this code for internet checking:--
public static boolean isConnected(Context context) {
ConnectivityManager manager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = manager.getActiveNetworkInfo();
if (info == null)
return false;
if ((info.getState() != State.CONNECTED))
return false;
return true;
}
Hope the below code may help you.
public static boolean checkNetworkStatus(Context cxt) {
boolean isFound = false;
ConnectivityManager conMgr = (ConnectivityManager) cxt
.getSystemService(Context.CONNECTIVITY_SERVICE);
if (conMgr.getActiveNetworkInfo() != null
&& conMgr.getActiveNetworkInfo().isAvailable()
&& conMgr.getActiveNetworkInfo().isConnected()) {
isFound = true;
} else {
isFound = false;
}
return isFound;
}
Also use the below permissions in manifest file.
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />