Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] This field leaks a context object

Bom dia a todos

Eu to fazendo um projeto pessoal de aplicativo, e nele estou utilizando o Hilt para injeção de depedências e o View model para o gerenciamento de estados e integração do ui com regra de negócio.

eu precisava do contexto para um toast para mostrar a mensagem e tentei utilizar o Hilt para pegá-lo:

@HiltViewModel
class CadastrodeBolasViewModel @Inject constructor(
    private val repositorio: MundoBolaRepositorio,
    @ApplicationContext private val context: Context,
) : ViewModel() {//resto do código omitido
    context.mensagemDeAviso("Bola cadastrada com sucesso")

Mas na propertie de context aparece uma mensagem de warning em cima dele:

This field leaks a context object

Eu pesquisei e apareceu esse fórum

Alguns falam que não tem vazamento, tem gente que fala que é interessante trocar o jeito de pegar o contexto para evitar isso. Eu fiz assim:

@HiltViewModel
class CadastrodeBolasViewModel @Inject constructor(
    private val repositorio: MundoBolaRepositorio,
    private val application: Application,
) : ViewModel() {//resto do código omitido
application.applicationContext.mensagemDeAviso("Bola cadastrada com sucesso")

A minha dúvida é: porque esse vazamento seria ruim para o aplicativo?

E se realmente isso é um problema, ou podemos ignorar esse alerta?

Ps: se quiserem dar uma olhada, esse é o link do meu projeto. Lembrando que ele está em fase inicial e ele ainda vai crescer bastante com o tempo

1 resposta
solução!

Bom dia!

O vazamento de contexto ocorre quando uma referência a um objeto de contexto é mantida além do tempo necessário, impedindo que a memória seja liberada corretamente. Isso pode resultar em um consumo excessivo de memória e até mesmo em crashes no aplicativo.

No seu caso, ao injetar o contexto diretamente na classe ViewModel, você está mantendo uma referência a ele por tempo indeterminado, o que pode levar ao vazamento de contexto. O alerta que você está vendo é uma indicação do Android Studio para te alertar sobre essa possibilidade.

Uma forma de evitar o vazamento de contexto é utilizar o contexto de aplicação, que é estático e não está vinculado a uma atividade específica. Ao utilizar application.applicationContext, como você fez na segunda opção, você está obtendo o contexto de aplicação e evitando o vazamento.

É importante ressaltar que, em alguns casos, o vazamento de contexto pode não ter um impacto significativo no desempenho do aplicativo. No entanto, é uma boa prática evitá-lo, especialmente em aplicativos maiores e mais complexos.

Recomendo que você utilize a segunda opção, utilizando o contexto de aplicação, para evitar o vazamento de contexto em seu projeto. Dessa forma, você estará seguindo as boas práticas e garantindo um melhor desempenho e estabilidade para o seu aplicativo.

:)