2012-03-16 2 views
1

Я пытаюсь реализовать ping с использованием HttpGet, но поведение случайное.Случайное поведение API HttpGet Android

Я имею следующий код, который проверить подключение к интернету/сервер:

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

Над кодом я работает в потоке, как это может занять некоторое время. Когда я запускаю этот тест в первый раз, я получаю результат как истинный, но затем, когда поведение случайное, несколько раз оно давало мне ошибку «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 функция создает экземпляр тестовой нити и вызова функции запуска. когда тест сделан, я отправляю сообщение в основной поток, содержащий результат.

Спасибо.

ответ

2

Нет проблем с кодом. Это означает либо:

1) Иногда сервер действительно недоступен
2) Соединение происходит медленно, и время ожидания до достижения сервера.

Итак, установите время ожидания теста на некоторое большее значение, например 60000 (60 секунд), и снова проверьте. Если это работает, то вы знаете, что это было из-за таймаута.

EDIT

Также, пожалуйста, сделать это изменение, возможно, это дает нам больше информации:

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

+0

можете ли вы опубликовать код, чтобы я видел, как вы запускаете поток? – Caner

+0

См. Мой обновленный вопрос. – User7723337

Смежные вопросы