HttpGet Android API的随机行为
我试图使用HttpGet实现ping,但行为是随机的 我有以下测试internet/服务器连接的代码:HttpGet Android API的随机行为,android,http-get,Android,Http Get,我试图使用HttpGet实现ping,但行为是随机的 我有以下测试internet/服务器连接的代码: boolean result = false; HttpGet request = new HttpGet("www.MyServer.com"); HttpParams httpParameters = new BasicHttpParams(); HttpClient httpClient = new DefaultHttpClient(httpParameters); try {
boolean result = false;
HttpGet request = new HttpGet("www.MyServer.com");
HttpParams httpParameters = new BasicHttpParams();
HttpClient httpClient = new DefaultHttpClient(httpParameters);
try
{
HttpConnectionParams.setConnectionTimeout(httpParameters, 6000);
HttpConnectionParams.setSoTimeout(httpParameters, 6000);
HttpResponse response = httpClient.execute(request);
int status = response.getStatusLine().getStatusCode();
if (status == HttpStatus.SC_OK)
{
result = true;
}
}
catch(Exception e)
{
e.printStackTrace();
result = false;
}
Log.d("App", "Ping Result:"+result);
上面的代码我正在线程中运行,因为这可能需要时间。
当我第一次运行这个测试时,我得到的结果是true,但在行为是随机的之后,有时它会给我错误“主机不可访问”,我得到的结果是false
我只想测试服务器是否可以从当前配置的Android网络访问
是否有可靠的API来测试internet/服务器连接
更新:
在服务中,我有以下启动测试的功能
void startTest()
{
ServerTestThread mServerTestThread = new ServerTestThread()
mServerTestThread.start();
}
class ServerTestThread extends Thread
{
boolean result = false;
public void run()
{
//HttpGet code
//Send Message TO GUI Thread with result.
}
}
上面的startTest
函数正在创建测试线程的实例并调用start函数。测试完成后,我将向主线程发送包含结果的消息
谢谢。您的代码没有问题。这意味着: 1) 有时服务器确实无法访问
2) 连接速度慢,在到达服务器之前会超时 因此,测试将超时设置为更大的值,例如60000(60秒),然后再次检查。如果它工作,那么你知道这是因为超时 编辑 另外,请进行此更改,可能会提供更多信息:
Log.d("App", "Status:" + status);
if (status == HttpStatus.SC_OK)
{
result = true;
}
EDIT2
class ServerTestThread extends Thread
{
public static boolean result = false;
public static HttpGet request = new HttpGet("www.MyServer.com");
public static HttpParams httpParameters = new BasicHttpParams();
public static HttpClient httpClient = new DefaultHttpClient(httpParameters);
boolean result = false;
public void run()
{
//HttpGet code
//Send Message TO GUI Thread with result.
}
}
EDIT3这将告诉您是否连接到网络:
boolean connected = false;
ConnectivityManager connectivityManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
if(connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState() == NetworkInfo.State.CONNECTED ||
connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState() == NetworkInfo.State.CONNECTED) {
//we are connected to a network
connected = true;
}
警告:如果您连接到的WiFi网络不包括internet访问或需要基于浏览器的身份验证,已连接的
仍然为真
您的清单中需要此权限:
谢谢您的回复,但是为什么它第一次起作用呢。如果超时时间小于此值,则第一次也应失败。当这个代码在线程中被调用时,我需要添加一些清理吗?好的,当你想第二次运行时,你会怎么做?您是否再次调用startTest()
?是的,我再次调用startTest()。那一次我的测试失败了,并且在每第二次运行时它都会给我一个异常。好的,这意味着您创建了一个新线程,并且每次调用startTest
时都会建立新的连接。也许如果我们改变它,只有一个连接可以工作。将ServerTestThread
更改为我编辑的答案,并注释掉前面的结果、请求、httpParameters、,httpClient
定义。问题是,我使用它只是为了检查我是否连接到服务器/互联网,而我的android网络一直在从以太网/WIFI/Mobile更改,所以每次更改网络后,我都需要检查我们是否连接到互联网/服务器。因此,正如您所建议的,通过out维护“ServerTestThread”的单个实例,并仅使用代码“httpClient.execute(request)”和int status=response.getStatusLine().getStatusCode()调用run函数代码>这就是您的建议。此更改将使用当前连接的网络类型发送请求。