Случайное поведение HttpGet Android API

1

Я пытаюсь реализовать ping, используя 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);

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

Благодарю.

Теги:
http-get

1 ответ

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

Предупреждение. Если вы подключены к сети Wi-Fi, которая не включает доступ в Интернет или требует аутентификации на основе браузера, connected будет по-прежнему истинным.

вам понадобится это разрешение в вашем манифесте: <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

  • 0
    Спасибо за ответ, но почему он работает впервые. если тайм-аут меньше, то он также должен выйти из строя в первый раз. Нужно ли мне добавить какую-то очистку, так как этот код вызывается в потоке.
  • 0
    Вы можете опубликовать код, чтобы я видел, как вы запускаете поток?
Показать ещё 10 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню