2012-03-16 13 views
1

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

我有下面的代码,测试网络/服务器连接:

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); 

上面的代码,我在线程中运行,因为它可能需要一段时间。 当我第一次运行这个测试时,我得到的结果是真实的,但之后行为是随机的,有时它给了我错误'主机不可达',我得到的结果为假。

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

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

UPDATE:

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

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函数正在创建测试线程的实例并调用启动函数。当测试完成时,我将消息发送给包含结果的主线程。

谢谢。

回答

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
该W我会告诉你,如果你连接到网络:

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; 
} 

警告:如果您连接到Wi-Fi网络不包括互联网接入,或者需要基于浏览器的认证,connected仍然是真实的。

你需要这个权限在你的清单: <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

+0

感谢您的答复,但为什么它的第一次。如果超时时间少于第一次也应该失败。我需要添加某种清理,因为此代码正在一个线程中调用。 – User7723337 2012-03-16 09:02:20

+0

你可以发布代码,以便我看到你如何运行线程? – Caner 2012-03-16 09:05:05

+0

请参阅我更新的问题。 – User7723337 2012-03-16 09:33:49