HttpGet Android API的随机行为

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 {

我试图使用HttpGet实现ping,但行为是随机的

我有以下测试internet/服务器连接的代码:

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函数这就是您的建议。此更改将使用当前连接的网络类型发送请求。