Случайное поведение HttpGet Android API - PullRequest
1 голос
/ 16 марта 2012

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

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

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

Спасибо.

1 Ответ

2 голосов
/ 16 марта 2012

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

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
это скажет, если вы подключены к сети:

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" />

...