OkHttp: Pool de conexões e identificadores de arquivo

Usamos Retrofit / OkHttp3 para todo o tráfego de rede do nosso aplicativo Android. Até agora, tudo parece correr bem.

No entanto, agora ocasionalmente tivemos nosso aplicativo / processo sem identificadores de arquivo.

O Android permite um máximo de 1024 identificadores de arquivo por processoOkHttp criará um novo thread para cada chamada assíncronaCada thread criado dessa maneira (a partir de nossa observação) será responsável por 3 novos identificadores de arquivo (2 tubos e um soquete).

Conseguimos depurar isso exatamente, onde cada chamada assíncrona desanexada usando.enqueue() levará a um aumento de identificadores de arquivos abertos de 3.

O problema é que oConnectionPool no OkHttp parece manter os encadeamentos de conexão por muito mais tempo do que realmente são necessários. (Esta postagem conversas de cinco minutos, embora eu não tenha visto isso especificado em nenhum lugar.)

Isso significa que, se você estiver enviando rapidamente uma solicitação, opool de conexão aumentará de tamanhoe também onúmero de identificadores de arquivo - até chegar a 1024, onde o aplicativo falha.

Vi que é possível limitar o número de chamadas paralelas comDispatcher.setMaxRequests()(embora pareça incerto se isso realmente funciona, consulteaqui) - mas isso ainda não resolve o problema com os threads abertos e os manipuladores de arquivos acumulados.

Como podemos impedir que o OkHttp crie muitos identificadores de arquivo?

questionAnswers(1)

yourAnswerToTheQuestion