Sou desenvolvedor java há 2 anos.
Mas eu nunca escrevi uma WeakReference no meu código. Como usar o WeakReference para tornar meu aplicativo mais eficiente, especialmente o aplicativo Android?
java
android
weak-references
Chris
fonte
fonte
Respostas:
Usar um
WeakReference
no Android não é diferente de usar um no Java antigo comum. Aqui está um ótimo guia que fornece uma explicação detalhada: Noções básicas sobre referências fracas .Você deve pensar em usar um sempre que precisar de uma referência a um objeto, mas não deseja que essa referência proteja o objeto do coletor de lixo. Um exemplo clássico é um cache no qual você deseja coletar lixo quando o uso da memória fica muito alto (geralmente implementado com
WeakHashMap
).Certifique-se de verificar
SoftReference
ePhantomReference
também.EDIT: Tom levantou algumas preocupações sobre a implementação de um cache com
WeakHashMap
. Aqui está um artigo descrevendo os problemas: WeakHashMap não é um cache!Tom está certo de que houve reclamações sobre o fraco desempenho do Netbeans devido ao
WeakHashMap
cache.Ainda acho que seria uma boa experiência de aprendizado implementar um cache
WeakHashMap
e compará-lo com seu próprio cache implementado manualmenteSoftReference
. No mundo real, você provavelmente não usaria nenhuma dessas soluções, pois faz mais sentido usar uma biblioteca de terceiros como o Apache JCS .fonte
WeakHashMap
usado como cache é fatal. As entradas podem ser removidas assim que são criadas. Provavelmente isso não acontecerá quando você estiver testando, mas pode muito bem quando estiver em uso. É importante notar que o NetBeans pode ser levado a uma parada efetiva de 100% da CPU.WeakHashMap
mesmo se você está correto que é uma má escolha;)[EDIT2] Encontrei outro bom exemplo de
WeakReference
. Processando bitmaps Fora da página Thread da interface do usuário no guia de treinamento Exibindo bitmaps com eficiência , mostra um usoWeakReference
no AsyncTask.Diz,
Feliz codificação!
[EDIT] Encontrei um bom exemplo
WeakReference
do facebook-android-sdk . A classe ToolTipPopup nada mais é do que uma simples classe de widget que mostra a dica de ferramenta acima da visualização âncora. Eu capturei uma captura de tela.A aula é realmente simples (cerca de 200 linhas) e digna de ser vista. Nessa classe, a
WeakReference
classe é usada para manter referência à exibição de âncora, o que faz todo sentido, porque possibilita que a exibição de âncora seja coletada como lixo, mesmo quando uma instância de dica de ferramenta vive mais que sua exibição de âncora.Feliz codificação! :)
Deixe-me compartilhar um exemplo
WeakReference
prático de classe. É um pequeno trecho de código do widget de estrutura do Android chamadoAutoCompleteTextView
.Em resumo, a
WeakReference
classe é usada para armazenarView
objetos para evitar vazamento de memória neste exemplo.Vou copiar e colar a classe PopupDataSetObserver, que é uma classe aninhada
AutoCompleteTextView
. É realmente simples e os comentários explicam bem a classe. Feliz codificação! :)E o
PopupDataSetObserver
é usado na configuração do adaptador.Uma última coisa. Eu também queria saber o exemplo de trabalho
WeakReference
no aplicativo Android e poderia encontrar alguns exemplos em seus aplicativos oficiais. Mas eu realmente não conseguia entender o uso de alguns deles. Por exemplo, os aplicativos ThreadSample e ExibindoBitmaps usamWeakReference
em seu código, mas depois de executar vários testes, descobri que o método get () nunca retornanull
, porque o objeto de exibição referenciado é reciclado em adaptadores, e não em lixo coletado.fonte
Algumas das outras respostas parecem incompletas ou excessivamente longas. Aqui está uma resposta geral.
Como usar o WeakReference em Java e Android
Você pode executar as seguintes etapas:
WeakReference
variávelCódigo
MyClass
tem uma referência fraca aAnotherClass
.AnotherClass
tem uma forte referência aMyClass
.Notas
MyClass
estava A eAnotherClass
foi B.WeakReference
é fazer com que outra classe implemente uma interface. Isso é feito no padrão de ouvinte / observador .Exemplo prático
fonte
// allow MyClass to get a weak reference to this class void someMethod() { mMyClass = new MyClass(); mMyClass.someMethod(this); }
??weakreference
próprio objeto nadoSomething
função para não estarnull
antes de chamar aget
função.Um mapeamento "canonizado" é o local onde você mantém uma instância do objeto em questão na memória e todas as outras pesquisam essa instância em particular por meio de ponteiros ou de algum mecanismo desse tipo. É aqui que as referências fracas podem ajudar. A resposta curta é que WeakReference objetos podem ser usados para criar ponteiros para objetos em seu sistema, enquanto ainda permitem que esses objetos sejam recuperados pelo coletor de lixo depois que eles saem do escopo. Por exemplo, se eu tivesse um código como este:
Qualquer objeto que eu registrar nunca será recuperado pelo GC porque há uma referência a ele armazenado no conjunto de
registeredObjects
. Por outro lado, se eu fizer isso:Então, quando o GC quiser recuperar os objetos no Conjunto, poderá fazê-lo. Você pode usar esta técnica para armazenar em cache, catalogar etc. Veja abaixo as referências a discussões muito mais aprofundadas sobre GC e armazenamento em cache.
Ref: Coletor de Lixo e WeakReference
fonte