Pergunta

estou a usar ThreadSaFeclientConnManager para gerenciar um Pool de conexões de clientes, porque meu aplicativo possui vários threads, que estão se conectando simultaneamente a um servidor da web.

Código de amostra abstrato:

HttpClient httpClient;
ClientConnectionManager conMgr = new ThreadSafeClientConnManager(parameters,schReg);
httpclient = new DefaultHttpClient(conMgr, parameters);

Agora vamos dizer que sobre esses threads está baixando um arquivo grande, mas o usuário do meu aplicativo está mudando para outra atividade/tela. Portanto, o arquivo é desnecessário e eu gostaria de abortar essa conexão de download.

Dentro ThreadSaFeclientConnManager Eu encontrei este método:

public ClientConnectionRequest requestConnection (HttpRoute route, Object state)Retorna um novo ClientConnectionRequest, do qual uma gestão gerenciada pode ser obtida ou a O pedido pode ser abortado.

Até agora eu tenho usado:

HttpGet httpRequest = new HttpGet(URL_TO_FILE);
HttpResponse response = (HttpResponse) httpclient.execute(httpRequest);
[...]

Agora, pelo que entendi, tenho que usar:

httpclient.getConnectionManager().requestConnection(HttpRoute route, Object state);

E esse é o ponto em que estou preso. Presumo que, para a rota que posso usar new HttpRoute(new HttpHost("10.0.0.1")) ou qualquer que seja o meu servidor, mas o que colocar para Object state?

E segundo, assim que eu ClientConnectionManager eu posso ligar getConnection(long timeout, TimeUnit tunit). Mas então, a partir daí, como eu executo meu HttpGet httpRequest = new HttpGet(URL_TO_FILE); Como eu fiz antes com HttpResponse response = (HttpResponse) httpclient.execute(httpRequest);?

Eu passei pela documentação e tentei algumas coisas diferentes, mas não consegui obter uma solução de trabalho. Portanto, para sugestões e/ou exemplos de código são mais que bem -vindos.

Foi útil?

Solução

Você só precisa ligar httpRequest.abort() e a conexão deve ser fechada.

Com um arquivo grande, você deve ter um processo de loop dos dados. Você pode simplesmente verificar o status de cancelar e abortar a partir daí,

    HttpEntity entity = response.getEntity();
    if (entity != null) {
        InputStream instream = entity.getContent();
        while (instream.read(buf) >= 0) {
            if (cancelled)
               httpRequest.abort();
            // Process the file
        }
     }

Quando o pool ou o Keepalive é usado, a conexão abortada não pode ser devolvida à piscina e deve ser fechada. Houve um bug nas versões mais antigas de que a conexão é mantida viva e atrapalha a próxima solicitação. Eu acho que tudo isso é fixo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top