Android究竟是如何判断是不是在线的?
Posted
技术标签:
【中文标题】Android究竟是如何判断是不是在线的?【英文标题】:How exactly does Android determine whether it's online?Android究竟是如何判断是否在线的? 【发布时间】:2012-11-04 05:38:39 【问题描述】:android究竟是如何判断以下状态的区别的?
网络接口处于活动状态(例如 Wifi 或 3G),但无法访问互联网。
网络接口处于活动状态,需要要求用户在网页上登录网络。
网络接口处于活动状态并能够访问互联网。
它是否可能向固定 URL(可能在 google.com 上?)发送一个简单的 HTTP 请求并检查返回的文档是否符合预期?如果有,我们是否知道使用的 URL?
【问题讨论】:
【参考方案1】:更新:更新了代码以避免NetworkOnMainThreadException
我目前正在使用以下方法来判断设备是否可以上网:
public class NetworkConnectivityHelper
public void isDeviceConnectedToInternet(final Activity activity, final ResultCallback callback)
new Thread(new Runnable()
@Override
public void run()
boolean isDeviceConnectedToInternet = false;
NetworkInfo activeNetworkInfo = ((ConnectivityManager) activity.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo();
if(activeNetworkInfo != null && activeNetworkInfo.isConnected())
try
InetAddress.getByName("google.com").isReachable(2);
isDeviceConnectedToInternet = true;
catch (UnknownHostException e)
isDeviceConnectedToInternet = false;
catch (IOException e)
isDeviceConnectedToInternet = false;
final boolean result = isDeviceConnectedToInternet;
activity.runOnUiThread(new Runnable()
@Override
public void run()
callback.done(result);
);
).start();
public static abstract class ResultCallback
public abstract void done(boolean connected);
通过以下方式调用:
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
....
//Populate
NetworkConnectivityHelper networkConnectivityHelper = new NetworkConnectivityHelper();
networkConnectivityHelper.isDeviceConnectedToInternet(activity, new NetworkConnectivityHelper.ResultCallback()
@Override
public void done(boolean connected)
if (connected)
//Yey, the device is connected.
//Now, do some work
else
//The device is disconnected
);
....
希望这会有所帮助!
【讨论】:
这将在更高版本的 android 上强制关闭,以便在主线程上使用网络连接。此外,在我测试的需要登录的 wifi 网络上,此测试在不应该连接时仍返回为已连接。【参考方案2】:是的,您也可以发送 ping :)
您应该在小型网络实用程序类中使用的订单操作是: - 检查接口是否在线 - 检查它是否能够打开到 Google.com 的套接字或 ping google.com
【讨论】:
【参考方案3】:试试这个:
public static boolean isNetworkAvailable(Context context)
ConnectivityManager cm = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = cm.getActiveNetworkInfo();
return (info != null);
【讨论】:
以上是关于Android究竟是如何判断是不是在线的?的主要内容,如果未能解决你的问题,请参考以下文章
bufferedReader() 在 Kotlin 中究竟是如何工作的?