最好的方法来检查Android中的互联网连接
我正在开发android
应用程序,我想知道检查互联网连接是否存在的最佳方法。我曾尝试使用connectivity manager
和networkinfo
类,但无济于事,因为我的应用程序一直在没有网络的情况下崩溃,否则我会去HttpConnection
方法。有人可以提出宝贵的建议。最好的方法来检查Android中的互联网连接
URL myurl = new URL(url);
URLConnection connection = myurl.openConnection();
connection.setConnectTimeout(20 * 1000);
HttpURLConnection httpConnection = (HttpURLConnection) connection;
int responseCode = -1;
try {
responseCode = httpConnection.getResponseCode();
} catch (Exception e1) {
throw e1;
}
if (responseCode == HttpURLConnection.HTTP_OK) {
//connection is OK and do what you want
//...
}
else
{
//connection is not OK
httpConnection.disconnect();
}
breceive ...非常感谢这个代码很好的工作。 –
你的欢迎:) – breceivemail
它的一个老问题,但我正在做的是在这里回答,使其对其他人也有用。使一个类象下面这样:
public class ConnectionDetector {
private Context context;
public ConnectionDetector(Context context) {
this.context = context;
}
public boolean isConnectedToInternet() {
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;
}
}
然后从activity
调用类method
像这样来检查连接:
if(new ConnectionDetector(context).isConnectedToInternet()){
//Connected
//do what you want to do here
} else{
// Not connected
// show appropriate message
}
Udacity的优秀高级Android应用程序开发过程中使用getActiveNetworkInfo()
https://www.udacity.com/course/advanced-android-app-development--ud855
/**
* @param context Context used to get the ConnectivityManager
* @return true if network has connectivity (i.e. is reachable), else return false
*/
static public boolean isNetworkAvailable(Context context) {
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return ((activeNetworkInfo != null)
&& activeNetworkInfo.isConnectedOrConnecting());
}
顺便说一句:Clairvoyant使用getAllNetworkInfo的好答案,现在在API级别23中已弃用。
Android文档说使用getAllNetworks()和getNetworkInfo(android.net.Network)来代替。
http://developer.android.com/reference/android/net/ConnectivityManager.html#getAllNetworkInfo()
我如下更新火眼金睛的方法,并用它,直到我看到上面Udacity的简单方法isNetworkAvailable。
/**
* @return true if network has connectivity (i.e. is reachable), else return false
*/
boolean hasConnectivity(Context context) {
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivityManager != null) {
Network[] networks = connectivityManager.getAllNetworks();
if ((networks != null)
&& (networks.length > 0)) {
for (Network network : networks) {
NetworkInfo info = connectivityManager.getNetworkInfo(network);
if (info.getState() == NetworkInfo.State.CONNECTED) {
return true;
}
}
}
}
return false;
}
我建议您检查异常以指定发生了什么错误,并且您可以根据错误提示用户。
try {
URL url = new URL("https://google.com");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setConnectTimeout(10000);
connection.connect();
success = connection.getResponseCode() == 200;
} catch (IOException e) {
//use the function here
onError(this,e);
}
public void onError(Activity activity,Throwable e){
try {
e.printStackTrace();
FirebaseCrash.report(e);
if (e instanceof HttpException) {
Response body = ((HttpException) e).response();
if (body.code() == 401) {
Toast.makeText(activity, "Not Authorized Access", Toast.LENGTH_SHORT).show();
} else if (body.code() == 404) {
Toast.makeText(activity, "Request not found", Toast.LENGTH_SHORT).show();
} else if (body.code() == 400) {
Toast.makeText(activity, "Bad Request", Toast.LENGTH_SHORT).show();
} else if (body.code() == 500) {
Toast.makeText(activity, "Internal Server Error", Toast.LENGTH_SHORT).show();
} else {
Log.e(Constants.TAG, "Error : Code HTTP = " + body.code());
}
}else if(e instanceof ConnectException || e instanceof SocketException){
Toast.makeText(activity, "No Internet Connection", Toast.LENGTH_SHORT).show();
} else if (e instanceof UnknownHostException) {
Toast.makeText(activity, "Make Sure Your Internet Connection is Properly Connected", Toast.LENGTH_SHORT).show();
} else if (e instanceof SSLHandshakeException || e instanceof SSLPeerUnverifiedException) {
Toast.makeText(activity, "Server Connection Problem..Please Try Again", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(activity, "Data Load Error", Toast.LENGTH_SHORT).show();
}
}
catch (Exception ex){
FirebaseCrash.report(e);
e.printStackTrace();
}
}
你确定这是缺乏导致你的应用程序崩溃的“网络”吗? Raja的代码应该可以工作。 – Austin
是的,我已经尝试过它在模拟器和手机上 –