Можно ли установить тайм-аут для отключения установленного http-соединения?

Я пишу приложение для загрузки файлов. Я могу подключиться к серверу и загрузить файл (apache http) с помощью метода asyn.
Сервер установил ограничение на количество подключений до 100. Я хочу установить тайм-аут подключения, чтобы отключить подключение, если подключение длилось 60 секунд.

Вот поток:
(1 ) Клиент Android устанавливает соединение с сервером. (Начальный счет для 60 секунд)
(2) Если соединение все еще живо после 60 секунд, отключитесь от клиента Android.

Я знаю, что установить тайм-аут для HttpParams не получится. Я понятия не имею, как это сделать.
Кто-нибудь знает, как это сделать? Любое решение или предложение приветствуется. Спасибо!

Вот фрагмент кода, как загрузить файл:

try
{
        HttpParams httpParameters = new BasicHttpParams();
        HttpConnectionParams.setConnectionTimeout(httpParameters, 60000);
        HttpConnectionParams.setSoTimeout(httpParameters, 60000);


        HttpClient client =  new DefaultHttpClient(httpParameters);  
        ...
        ByteArrayBody bab = new ByteArrayBody(byteArray, "photo.jpg");
        entity.addPart("photo", bab);
        httpPost.setEntity(entity);   

        startTime = System.currentTimeMillis();


        //ClientConnectionRequest connRequest = new ManagedClientConnection();
        //httpPost.setConnectionRequest((ClientConnectionRequest) connRequest.getConnection(3000, TimeUnit.MILLISECONDS));

        HttpResponse response = client.execute(httpPost, localContext);

        Handler mHandler = new Handler();

        BufferedReader reader = new BufferedReader(new InputStreamReader( response.getEntity().getContent(), "UTF-8"));  
        String result = "";  
        String tmp = "";



        while ((tmp = reader.readLine()) != null)
        {
            result += tmp;
        }
        reader.close();

        return result;

    } catch (Exception e) {  
        Log.e(TAG, "error time = " + (System.currentTimeMillis() - startTime));
        Log.e("httpUploadHandler", "Some error came up"); 
        Log.e("httpUploadHandler", e.toString()); 

    }   


Я могу разорвать соединение, позвонив:

client.getConnectionManager().shutdown();

Но как я могу посчитать 60 секунд до отключения активного соединения? Кроме того, можно ли узнать, когда соединение установлено?


person mobile app Beginner    schedule 27.04.2012    source источник


Ответы (2)


Используйте обработчик в своей деятельности для выполнения работы. Код ниже даст вам представление:

 private ShutDownHandler mRedrawHandler = new ShutDownHandler(); 

     class ShutDownHandler extends Handler {  
            @Override  
            public void handleMessage(Message msg) {  
         client.getConnectionManager().shutdown();
            }  

            public void doJob(long delayMillis) {  
              this.removeMessages(0);  
              sendMessageDelayed(obtainMessage(0), delayMillis);  
            }  
          };  

вызовите mRedrawHandler.doJob (60000) из основного потока.

person Akhil    schedule 27.04.2012
comment
Мой метод отправки файла находится внутри класса, который расширяет AsyncTask ‹String, Void, String›. Я получаю сообщение об ошибке «Не могу создать обработчик внутри потока, который не вызвал Looper.prepare ()». Есть ли какая-то работа, чтобы сделать то, что вы предложили? Спасибо - person mobile app Beginner; 27.04.2012
comment
Спасибо, это работает. Я поставил httpAsync.mRedrawHandler.doJob (60000); перед HttpResponse response = client.execute (httpPost, localContext) ;. Но это не на 100% то, что я хочу. На самом деле, я хочу запустить doJob (60000) после успешного установления соединения. Можно ли это обнаружить? - person mobile app Beginner; 27.04.2012
comment
В настоящее время мне неизвестен какой-либо метод обратного вызова, который уведомляет о том, что соединение установлено. Я сообщу вам, как только узнаю. - person Akhil; 27.04.2012
comment
Спасибо Ахилу! Ты мне очень помогаешь - person mobile app Beginner; 27.04.2012

Вы пробовали установить тайм-аут сокета? Он отличается от тайм-аута соединения.

params.setParameter( HttpConnectionParams.SO_TIMEOUT, 60000 );

где params - это экземпляр BasicHttpParams, и он передается в конструктор DefaultHttpClient.

person Jason Robinson    schedule 27.04.2012
comment
Да, попробовал (отредактировал вопрос и вложил в него фрагмент кода). Я думаю, что SO_TIMEOUT - это значение тайм-аута для потери соединения с сокетом. - person mobile app Beginner; 27.04.2012
comment
На самом деле я хочу закрыть соединение через 60 секунд после установления соединения. Является ли это возможным? Спасибо - person mobile app Beginner; 27.04.2012