我需要帮助检查我的应用程序正在运行的手机是否已连接到Internet。我开始ping一个IP来检查连接。它是这样的:如何在Android上正确使用AsyncTask?
protected Boolean checkInternetConnection(Void... params) {
try {
InetAddress ipAddr = InetAddress.getByName("https://www.google.com");
if (!ipAddr.isReachable(10000)) {
return false;
} else {
return true;
}
} catch (Exception e) {
Log.e("exception", e.toString());
return false;
}
}
}
然而,永诺扔NetworkOnMainThreadException,所以我用的AsyncTask:
private class CheckConnectionTask extends AsyncTask<Void, Void, Boolean> {
@Override
protected Boolean doInBackground(Void... params) {
try {
InetAddress ipAddr = InetAddress.getByName("https://www.google.com");
if (!ipAddr.isReachable(10000)) {
return false;
} else {
return true;
}
} catch (Exception e) {
Log.e("exception", e.toString());
return false;
}
}
}
这段代码是否正确?因为我不知道怎么称呼它。我试过了:
new CheckConnectionTask().execute();
有什么遗漏吗?因为它不起作用。另外请注意,我见过很多以前的问题,但是我没有找到任何对这个问题的答案,所以我问了我自己的问题。如果你已经看到一个可以解决我的问题的答案,你可以在这里链接,但请记住,我对Android或Java没有经验,所以我可能不清楚。我会以正确的代码作为答案,并简要说明我为什么不工作。另外,我需要知道手机是否连接到INTERNET,而不是NETWORK,因此ConnectivityManager不会为我工作。
编辑 - 谢谢大家的回答。首先,我拥有所有需要的权限。此外,我不能得到任何结果目前,由于Android工作室凸显了下面的代码:
Boolean internetConnection;
internetConnection = new CheckConnectionTask().execute();
由于不正确的,它根本不会让我调用该函数。它有什么问题?它是否缺少任何参数?因为我将参数定义为Void,所以看起来不合逻辑。
编辑2 - 我用onPostExecute,通过@vandaics的建议,现在看起来是这样的:
private class CheckConnectionTask extends AsyncTask<Void, Void, Boolean> {
@Override
protected Boolean doInBackground(Void... params) {
try {
InetAddress ipAddr = InetAddress.getByName("google.com");
if (!ipAddr.isReachable(10000)) {
return false;
} else {
return true;
}
} catch (Exception e) {
Log.e("exception", e.toString());
return false;
}
}
@Override
protected void onPostExecute(Boolean result) {
super.onPostExecute(result);
internetConnection = result;
}
}
它的工作原理,我把它叫做调用onCreate方法时:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new CheckConnectionTask().execute();
}
它的工作原理,我的应用程序检查互联网是否连接并正确反应。如果您认为有些东西可能无法使用,或者有更简单的方法来解决问题,请告诉我。非常感谢你们,尤其是@vandaics和@Sunil。此外,我是否需要像这样使用超类?:
@Override
protected void onPostExecute(Boolean result) {
super.onPostExecute(result);
internetConnection = result;
}
它是做什么的,是否有必要?
您的应用程序是否有权访问Internet?你有清单中的<使用权限android:name =“android.permission.INTERNET”/>“吗? –
你尝试过网络连接吗? –
你怎么知道它什么都没做。那里没有记录表明它是成功还是失败。只有这样,您才会知道它是否执行了任何操作,如果由于例外而失败 – ucsunil