Atualizei para o Android Studio 3.1 hoje, o que parece ter adicionado mais algumas verificações. Uma dessas verificações de fiapos é para subscribe()
chamadas RxJava2 de uma só vez que não são armazenadas em uma variável. Por exemplo, obtendo uma lista de todos os jogadores do banco de dados da minha sala:
Single.just(db)
.subscribeOn(Schedulers.io())
.subscribe(db -> db.playerDao().getAll());
Resulta em um grande bloco amarelo e esta dica de ferramenta:
O resultado de
subscribe
não é usado
Qual é a melhor prática para chamadas Rx únicas como essa? Devo manter a preensão do Disposable
e dispose()
em completa? Ou devo apenas @SuppressLint
seguir em frente?
Isso parece afetar apenas RxJava2 ( io.reactivex
), RxJava ( rx
) não possui esse fiapo.
android
android-studio
rx-java2
lint
android-studio-3.1
Michael Dodd
fonte
fonte
Disposable
escopo de membros at e chamandodispose()
quando o single é concluído, mas parece desnecessariamente complicado. Estou interessado em ver se há alguma maneira melhor de fazer isso.Respostas:
O IDE não sabe quais os efeitos potenciais que sua assinatura pode ter quando não é descartada; portanto, trata-a como potencialmente insegura. Por exemplo, você
Single
pode conter uma chamada de rede, o que pode causar um vazamento de memória se vocêActivity
for abandonado durante a execução.Uma maneira conveniente de gerenciar uma grande quantidade de
Disposable
s é usar um CompositeDisposable ; basta criar uma novaCompositeDisposable
variável de instância em sua classe anexa e adicionar todos os seus Disposables ao CompositeDisposable (com o RxKotlin, você pode simplesmente anexaraddTo(compositeDisposable)
todos os seus Disposables). Por fim, quando terminar sua instância, liguecompositeDisposable.dispose()
.Isso eliminará os avisos de fiapos e garantirá que você
Disposables
seja gerenciado corretamente.Nesse caso, o código seria semelhante a:
fonte
error: cannot find symbol method addTo(CompositeDisposable)
com "rxjava: 2.1.13". De onde vem esse método? (RxSwift ou RxKotlin, suponho)No momento em que a atividade será destruída, a lista de descartáveis é limpa e nós estamos bem.
fonte
Você pode se inscrever com DisposableSingleObserver :
Caso você precise descartar diretamente o
Single
objeto (por exemplo, antes que ele seja emitido), você pode implementar o métodoonSubscribe(Disposable d)
para obter e usar aDisposable
referência.Você também pode realizar a
SingleObserver
interface por conta própria ou usar outras classes filho.fonte
Como foi sugerido, você pode usar um pouco de global
CompositeDisposable
para adicionar o resultado da operação de inscrição lá.A biblioteca RxJava2Extensions contém métodos úteis para remover automaticamente o descartável criado do
CompositeDisposable
quando ele é concluído. Consulte a seção subscribeAutoDispose .No seu caso, pode ser assim
fonte
Você pode usar o Uber AutoDispose e o rxjava
.as
Certifique-se de entender quando cancelar a inscrição com base no ScopeProvider.
fonte
Repetidas vezes, volto à questão de como descartar corretamente as assinaturas e a esta publicação em particular. Vários blogs e conversas afirmam que não chamar
dispose
necessariamente leva a um vazamento de memória, o que eu acho que é uma afirmação muito geral. Em meu entendimento, o aviso de não utilização do resultado desubscribe
não é um problema em alguns casos, porque:Como não quero suprimir avisos de fiapos, recentemente comecei a usar o seguinte padrão para casos com um observável síncrono:
Eu estaria interessado em quaisquer comentários sobre isso, independentemente de ser uma confirmação de correção ou a descoberta de uma brecha.
fonte
Existe outra maneira disponível, que é evitar o uso manual de descartáveis (adicionar e remover assinaturas).
Você pode definir um Observável e esse observável receberá o conteúdo de um SubjectBehaviour (caso você use RxJava). E passando isso observável ao seu LiveData , isso deve funcionar. Confira o próximo exemplo com base na pergunta inicial:
fonte
Se você tem certeza de que o descartável foi tratado corretamente, por exemplo, usando o operador doOnSubscribe (), você pode adicioná-lo ao Gradle:
fonte
@SuppressLint("CheckResult")
apenas o método.