要检查互联网连接,我使用此代码:
public boolean isOnline() {
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
//return netInfo != null && netInfo.isConnectedOrConnecting();
return netInfo != null && netInfo.isAvailable() && netInfo.isConnected();
}
这是我在任何地方都能找到的最常用的代码 - 但它无法可靠地工作。
虽然我无法使用互联网,但这种情况仍然存在 我的手机上的其他应用正确地给出了消息:'无法连接到互联网'。
编辑1
当互联网连接存在时,它似乎返回true - 即使由于某种原因它不可用。
如果我在手机上关闭移动数据/互联网 - 那么此方法正确返回false。
答案 0 :(得分:2)
所有人都会告诉您,如果您的设备已连接,他们不会告诉您互联网状态...
为此你应该使用这个代码...
private boolean isOnline() {
try{
// ping to googlevto check internet connectivity
Socket socket = new Socket();
SocketAddress socketAddress = new InetSocketAddress("8.8.8.8", 80);
socket.connect(socketAddress, 3000);
socket.close();
return true;
} catch (Exception e) {
// internet not working
return false
}
}
您必须在异步任务中执行此操作,否则它将为您提供主线程异常的网络...
我假设你已经在异步任务中调用了isOnline方法。
如果你没有在异步任务中使用它,那么 你必须像这样使用它....
例如,您希望仅在互联网可用时才转到xyz活动
private class GoToXYZActivity extends AsyncTask<String, Void, Void> {
boolean internetAvailable;
protected String doInBackground(String... urls) {
//THIS METHOD WILL BE CALLED AFTER ONPREEXECUTE
//YOUR NETWORK OPERATION HERE
internetAvailable = inOnline();
return null;
}
protected void onPreExecute() {
super.onPreExecute();
//THIS METHOD WILL BE CALLED FIRST
//DO OPERATION LIKE SHOWING PROGRESS DIALOG PRIOR TO BEGIN NETWORK OPERATION
}
protected void onPostExecute(String result) {
super.onPostExecute();
//TNIS METHOD WILL BE CALLED AT LAST AFTER DOINBACKGROUND
//DO OPERATION LIKE UPDATING UI HERE
if (internetAvailable)
/// goto xyz activity
else
/// toast - no internet
}
}
在点击事件中,您必须调用此方法
new GoToXYZActivity().execute();
答案 1 :(得分:0)
public boolean isConnectingToInternet(){
ConnectivityManager connectivity = (ConnectivityManager) _context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivity != null)
{
NetworkInfo[] info = connectivity.getAllNetworkInfo();
if (info != null)
for (int i = 0; i < info.length; i++)
if (info[i].getState() == NetworkInfo.State.CONNECTED)
{
return true;
}
}
return false;
}