Тайм-аут ответа Android - PullRequest
       12

Тайм-аут ответа Android

3 голосов
/ 15 марта 2012

Привет, мое приложение запрашивает некоторые данные с сервера, приложение показывает диалог пользователю до тех пор, пока приложение не получит результат, но в некоторых случаях приложение не получает никакого ответа и не происходит тайм-аут, и диалоговое окно остается навсегда на экране.* Ниже приведен код для HttpClient.

    HttpParams params = new BasicHttpParams();
    HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);  
    HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);  
    HttpProtocolParams.setUseExpectContinue(params, true);  
     // Turn off stale checking. Our connections break all the time anyway,
    // and it's not worth it to pay the penalty of checking every time.
    HttpConnectionParams.setStaleCheckingEnabled(params, false);

    // Default connection and socket timeout of 30 seconds. Tweak to taste.
    HttpConnectionParams.setConnectionTimeout(params, 5*1000);
    HttpConnectionParams.setSoTimeout(params, 30*1000);
    HttpConnectionParams.setSocketBufferSize(params, 8192);

    ConnManagerParams.setTimeout(params, 5 * 1000);
    ConnManagerParams.setMaxConnectionsPerRoute(params, new ConnPerRouteBean(50));
    ConnManagerParams.setMaxTotalConnections(params, 200);

    // Sets up the http part of the service.
    final SchemeRegistry supportedSchemes = new SchemeRegistry();

    // Register the "http" protocol scheme, it is required
    // by the default operator to look up socket factories.
    final SocketFactory sf = PlainSocketFactory.getSocketFactory();
    supportedSchemes.register(new Scheme("http", sf, 80));
    supportedSchemes.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));  
    final ThreadSafeClientConnManager ccm = new ThreadSafeClientConnManager(params,
            supportedSchemes);

    DefaultHttpClient httpClient = new DefaultHttpClient(ccm, params);`

Пожалуйста, укажите ошибку или некоторые другие предложения кода, если что-то не так в этом.

Ответы [ 3 ]

1 голос
/ 15 марта 2012

advice:

когда отображается диалоговое окно, необходимо отправить сообщение о задержке обработчику, при получении сообщения о задержке закрыть диалоговое окно и отменить запрос

Hanlder.sendEmptyMessageDelayed(what,delay_time)

HttpUriRequest.abort для отмены запроса

время задержки, на которое вы можете рассчитывать время ожидания или что вы считаете самым длинным.

1 голос
/ 15 марта 2012

Похоже, вы слишком усложняете работу с TimeOut.Попробуйте сделать это, как показано ниже:

//TimeOut is set to 20 seconds
HttpParams httpParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParams, 20000);
HttpConnectionParams.setSoTimeout(httpParams, 20000);
HttpClient client = new DefaultHttpClient(httpParams);
0 голосов
/ 15 марта 2012

Я столкнулся с той же проблемой в одном из моих проектов.

HttpConnectionParams.setConnectionTimeout(httpParams, 20000);
HttpConnectionParams.setSoTimeout(httpParams, 20000);

, но я не знаю, почему вышеупомянутый код сниппер не работал в случайных случаях. Тайм-аут раньше случался, но не через 20 секунд в моем случае.

Так что я придумал немного хакерский подход. Я знаю, что это не рекомендуется. Но вы можете найти его полезным.у вас будет 3 сценария, в которых вы будете закрывать диалоговое окно и двигаться дальше.

1) закрывать диалоговое окно, как только получите ответ.

2) закрывать диалоговое окно, если истекает время ожидания

3) Напишите логику для закрытия диалога в handler.post dealyed. Убедитесь, что вы всегда упоминаете задержку как то, что вы дали в setSoTimeout (не рекомендуется, но полезно)

Так что в худшем случае, если вы неполучить ответ / тайм-аут в указанной продолжительности тайм-аута.Третий подход всегда будет работать.

Надеюсь, эта помощь.

...