HttpGet Android API的随机行为

时间:2012-03-16 08:36:52

标签: android http-get

我正在尝试使用HttpGet实现ping,但行为是随机的。

我正在使用以下代码测试互联网/服务器连接:

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,但是在行为是随机的之后,有时它给了我错误'host unreachable'并且我得到结果为false。

我只想测试服务器是否可以从当前配置的Android网络访问。

是否有可靠的API来测试互联网/服务器连接?

更新:

在服务中,我有以下功能启动测试。

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 个答案:

答案 0 :(得分:2)

您的代码没有问题。这意味着:

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网络不包含互联网访问权限或需要基于浏览器的身份验证,connected仍然有效。

您的清单中需要此权限: <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />