2012-03-16 11 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