检查活动的互联网连接 Android
Posted
技术标签:
【中文标题】检查活动的互联网连接 Android【英文标题】:Check for Active internet connection Android 【发布时间】:2013-07-17 01:35:28 【问题描述】:我正在尝试在我的应用程序中编写一个部分,以区分活动 Wifi 连接和互联网的实际连接。使用连接管理器确定是否有活动的 Wifi 连接非常简单,但是每次我尝试测试在连接 Wifi 但没有互联网连接时是否可以连接到网站时,我最终会陷入无限循环。 我曾尝试 ping 谷歌,但结果相同:
Process p1 = java.lang.Runtime.getRuntime().exec("ping -c 1 www.google.com");
int returnVal = 5;
try
returnVal = p1.waitFor();
catch (InterruptedException e)
e.printStackTrace();
boolean reachable = (returnVal==0);
return reachable;
我也试过这段代码:
if (InetAddress.getByName("www.xy.com").isReachable(timeout))
else
但我无法让 isReachable 工作。
【问题讨论】:
查看问题***.com/questions/4238921/… 【参考方案1】:我用这个:
public static void isNetworkAvailable(Context context)
HttpGet httpGet = new HttpGet("http://www.google.com");
HttpParams httpParameters = new BasicHttpParams();
// Set the timeout in milliseconds until a connection is established.
// The default value is zero, that means the timeout is not used.
int timeoutConnection = 3000;
HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
// Set the default socket timeout (SO_TIMEOUT)
// in milliseconds which is the timeout for waiting for data.
int timeoutSocket = 5000;
HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);
DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
try
Log.d(TAG, "Checking network connection...");
httpClient.execute(httpGet);
Log.d(TAG, "Connection OK");
return;
catch(ClientProtocolException e)
e.printStackTrace();
catch(IOException e)
e.printStackTrace();
Log.d(TAG, "Connection unavailable");
它来自另一个 *** 答案,但我找不到。
编辑:
终于找到了:https://***.com/a/1565243/2198638
【讨论】:
如果我 timeoutConnection = 2000 和 int timeoutSocket = 3000;【参考方案2】:这样查询一个网站:
通过将以下方法添加到您的类中,让您的类实现 AsyncTaskCompleteListenere<Boolean>
:
@Override
public void onTaskComplete(Boolean result)
Toast.makeText(getApplicationContext(), "URL Exist:" + result, Toast.LENGTH_LONG).show();
// continue your job
向您的类添加一个简单的testConnection
方法,以便在您要检查连接时调用:
public void testConnection()
URLExistAsyncTask task = new URLExistAsyncTask(this);
String URL = "http://www.google.com";
task.execute(new String[]URL);
最后是 URLExistAsyncTask
类,它作为异步(后台)任务执行连接测试,并在完成后回调您的 onTaskComplete
方法:
public class URLExistAsyncTask extends AsyncTask<String, Void, Boolean>
AsyncTaskCompleteListenere<Boolean> callback;
public URLExistAsyncTask(AsyncTaskCompleteListenere<Boolean> callback)
this.callback = callback;
protected Boolean doInBackground(String... params)
int code = 0;
try
URL u = new URL(params[0]);
HttpURLConnection huc = (HttpURLConnection) u.openConnection();
huc.setRequestMethod("GET");
huc.connect();
code = huc.getResponseCode();
catch (IOException e)
return false;
catch (Exception e)
return false;
return code == 200;
protected void onPostExecute(Boolean result)
callback.onTaskComplete(result);
【讨论】:
【参考方案3】:它确实对我有用:
验证网络可用性:
private Boolean isNetworkAvailable()
ConnectivityManager connectivityManager
= (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return activeNetworkInfo != null && activeNetworkInfo.isConnectedOrConnecting();
验证互联网访问:
public Boolean isOnline()
try
Process p1 = java.lang.Runtime.getRuntime().exec("ping -c 1 www.google.com");
int returnVal = p1.waitFor();
boolean reachable = (returnVal==0);
return reachable;
catch (Exception e)
// TODO Auto-generated catch block
e.printStackTrace();
return false;
【讨论】:
警告使用 ping 方法!这在我测试过的大多数设备上都很好用,但在 S4 Mini 上就不行了。 具体是哪个异常? 这有时会冻结 UI,因为它在 UI 线程上运行。【参考方案4】:为了检查 android 设备是否有活动连接,我使用下面的 hasActiveInternetConnection() 方法(1)尝试检测网络是否可用,(2)然后连接到 google.com 以确定网络是否可用活跃。
public static boolean hasActiveInternetConnection(Context context)
if (isNetworkAvailable(context))
if (connectGoogle())
return true;
else //one more try
return connectGoogle();
else
log("No network available! (in hasActiveInternetConnection())");
return false;
public static boolean isNetworkAvailable(Context ct)
ConnectivityManager connectivityManager = (ConnectivityManager) ct.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return activeNetworkInfo != null;
public static boolean connectGoogle()
try
HttpURLConnection urlc = (HttpURLConnection)(new URL("http://www.google.com").openConnection());
urlc.setRequestProperty("User-Agent", "Test");
urlc.setRequestProperty("Connection", "close");
urlc.setConnectTimeout(10000);
urlc.connect();
return (urlc.getResponseCode() == 200);
catch (IOException e)
log("IOException in connectGoogle())");
return false;
【讨论】:
【参考方案5】:这里有一些现代代码使用AsynTask
来解决当您尝试在主线程上连接时 android 崩溃的问题,并为用户引入带有冲洗和重复选项的警报。
class TestInternet extends AsyncTask<Void, Void, Boolean>
@Override
protected Boolean doInBackground(Void... params)
try
URL url = new URL("http://www.google.com");
HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
urlc.setConnectTimeout(3000);
urlc.connect();
if (urlc.getResponseCode() == 200)
return true;
catch (MalformedURLException e1)
// TODO Auto-generated catch block
e1.printStackTrace();
return false;
catch (IOException e)
// TODO Auto-generated catch block
e.printStackTrace();
return false;
return false;
@Override
protected void onPostExecute(Boolean result)
if (!result) // code if not connected
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setMessage("An internet connection is required.");
builder.setCancelable(false);
builder.setPositiveButton(
"TRY AGAIN",
new DialogInterface.OnClickListener()
public void onClick(DialogInterface dialog, int id)
dialog.cancel();
new TestInternet().execute();
);
AlertDialog alert11 = builder.create();
alert11.show();
else // code if connected
doMyStuff();
...
new TestInternet().execute();
【讨论】:
这很好,但是如果有 WiFi 连接而无法访问互联网,则需要很长时间,有什么解决方法吗?【参考方案6】:我确实使用了这种方法。它对我有用!适合想要真正上网的人!
public boolean isOnline()
try
HttpURLConnection httpURLConnection = (HttpURLConnection)(new URL("http://www.google.com").openConnection());
httpURLConnection.setRequestProperty("User-Agent", "Test");
httpURLConnection.setRequestProperty("Connection", "close");
httpURLConnection.setConnectTimeout(10000);
httpURLConnection.connect();
return (httpURLConnection.getResponseCode() == 200);
catch (IOException e)
e.printStackTrace();
return false;
每次都这样做!只需使用接收器
和=>
httpURLConnection.getResponseCode() == 200
这意味着互联网已连接!
【讨论】:
为了改进这个答案,我会注意到connect
不能从主线程调用,setReadTimeout
也很好。【参考方案7】:
您可以通过创建 new parallel thread
来计算时间:
final class QueryClass
private int responseCode = -1;
private String makeHttpRequest(URL url) throws IOException
String jsonResponse = "";
if(url == null)
return null;
HttpURLConnection urlConnection = null;
InputStream inputStream = null;
try
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("GET");
urlConnection.setReadTimeout(5000 );
urlConnection.setConnectTimeout(5000 );
Thread thread = new Thread()
@Override
public void run()
super.run();
try
sleep(5000);
catch (InterruptedException e)
e.printStackTrace();
if(responseCode == -1)
//Perform error message
Intent intent = new Intent(context,ErrorsActivity.class);
intent.putExtra("errorTextMessage",R.string.errorNoInternet);
intent.putExtra("errorImage",R.drawable.no_wifi);
context.startActivity(intent);
;
thread.start();
urlConnection.connect();
responseCode = urlConnection.getResponseCode();
if (responseCode == 200)
inputStream = urlConnection.getInputStream();
jsonResponse = readFromStream(inputStream);
【讨论】:
以上是关于检查活动的互联网连接 Android的主要内容,如果未能解决你的问题,请参考以下文章
如何在 iOS 和 Android 的 React Native 应用程序中检查互联网连接?