我想要一个返回 Internet 连接状态的方法,例如如果没有可用连接,则返回“离线”,如果无法连接到服务器,则返回“错误”,如果在线没有错误,则返回“在线”。
我想从主要威胁中调用此方法,我也无法在方法本身中发出 HTTP 请求,而必须将其放入AsyncTask
或类似的东西中。但我不知道如何操作我的代码。
这几乎是我想要的,但我怎样才能提取 try 块中的代码?它总是抛出NetworkOnMainThreadException
public static int isOnline(Activity activity)
{
ConnectivityManager cm = (ConnectivityManager) activity.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
int netType = 0;
if (netInfo != null)
{
netType = netInfo.getType();
if (netInfo.isAvailable() && netInfo.isConnected())
{
if (netType == ConnectivityManager.TYPE_WIFI || netType == ConnectivityManager.TYPE_MOBILE)
{
try
{
URL myUrl = new URL(HTTP_HOST);
URLConnection connection = myUrl.openConnection();
connection.setConnectTimeout(5000);
connection.connect();
return INTERNET_CONNECTIVITY_ONLINE;
} catch (IOException e)
{
return INTERNET_CONNECTIVITY_ERROR;
}
}
}
}
return INTERNET_CONNECTIVITY_OFFLINE;
}
编辑:
我忘了说我的 HTTP_HOST 需要 HTTP 身份验证。也许我也必须为请求添加这些身份验证?
编辑:
想要这样的东西:
public static int isOnline(Activity activity)
{
ConnectivityManager cm = (ConnectivityManager) activity.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
int netType = 0;
if (netInfo != null)
{
netType = netInfo.getType();
if (netInfo.isAvailable() && netInfo.isConnected())
{
if (netType == ConnectivityManager.TYPE_WIFI || netType == ConnectivityManager.TYPE_MOBILE)
{
MyAsyncTask as = new MyAsyncTask();
return as.execute("") == true ? INTERNET_CONNECTIVITY_ONLINE : INTERNET_CONNECTIVITY_ERROR;
}
}
}
return INTERNET_CONNECTIVITY_OFFLINE;
}