Estou registrando um ouvinte de alteração de preferências como este (na onCreate()
minha atividade principal):
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
prefs.registerOnSharedPreferenceChangeListener(
new SharedPreferences.OnSharedPreferenceChangeListener() {
public void onSharedPreferenceChanged(
SharedPreferences prefs, String key) {
System.out.println(key);
}
});
O problema é que o ouvinte nem sempre é chamado. Ele funciona pelas primeiras vezes que uma preferência é alterada e não é mais chamada até eu desinstalar e reinstalar o aplicativo. Parece que não é necessário reiniciar o aplicativo para corrigi-lo.
Encontrei um segmento de lista de discussão relatando o mesmo problema, mas ninguém realmente respondeu. O que estou fazendo de errado?
fonte
esta resposta aceita está ok, pois para mim está criando uma nova instância sempre que a atividade é retomada
Então, que tal manter a referência ao ouvinte dentro da atividade
e em seu onResume e onPause
isso será muito parecido com o que você está fazendo, exceto que estamos mantendo uma referência rígida.
fonte
super.onResume()
antesgetPreferenceScreen()...
?super.onResume()
é necessário ou usá-lo ANTESgetPreferenceScreen()
é necessária? porque eu estou falando sobre o lugar certo. cs.dartmouth.edu/~campbell/cs65/lecture05/lecture05.htmlthis
e nãolistener
, causou erro e eu poderia resolver o meu problema. Btw estes dois métodos são públicos agora, não protegidosComo esta é a página mais detalhada para o tópico que eu quero adicionar meu 50ct.
Tive o problema de que o OnSharedPreferenceChangeListener não foi chamado. Minhas Preferências Compartilhadas são recuperadas no início da Atividade principal por:
Meu código PreferenceActivity é curto e não faz nada, exceto mostrar as preferências:
Sempre que o botão de menu é pressionado, crio a PreferenceActivity a partir da Atividade principal:
Observe que o registro do OnSharedPreferenceChangeListener precisa ser feito DEPOIS de criar a PreferenceActivity nesse caso; caso contrário, o manipulador na atividade principal não será chamado !!! Levei um tempo doce para perceber que ...
fonte
A resposta aceita cria uma chamada
SharedPreferenceChangeListener
toda vezonResume
. O @Samuel resolve isso fazendoSharedPreferenceListener
um membro da classe Activity. Mas há uma terceira e mais simples solução que o Google também usa neste codelab . Faça sua classe de atividade implementar aOnSharedPreferenceChangeListener
interface e substituironSharedPreferenceChanged
a Atividade, tornando efetivamente a Atividade em siSharedPreferenceListener
.fonte
Código Kotlin para o registro SharedPreferenceChangeListener que ele detecta quando a mudança ocorrerá na chave salva:
você pode colocar esse código em onStart () ou em outro lugar .. * Considere que você deve usar
ou seus códigos dentro do bloco "// Do Something" serão executados incorretamente para cada alteração que ocorrer em qualquer outra chave em sharedPreferences
fonte
Portanto, não sei se isso realmente ajudaria alguém, mas resolvi o meu problema. Mesmo tendo implementado o
OnSharedPreferenceChangeListener
que foi declarado pela resposta aceita . Ainda assim, eu tinha uma inconsistência com o ouvinte sendo chamado.Eu vim aqui para entender que o Android envia para coleta de lixo depois de algum tempo. Então, olhei para o meu código. Para minha vergonha, eu não tinha declarado o ouvinte globalmente, mas dentro do
onCreateView
. E isso foi porque eu ouvi o Android Studio me dizendo para converter o ouvinte em uma variável local.fonte
Faz sentido que os ouvintes sejam mantidos no WeakHashMap. Como na maioria das vezes, os desenvolvedores preferem escrever o código dessa maneira.
Isso pode não parecer ruim. Mas se o contêiner OnSharedPreferenceChangeListeners não fosse WeakHashMap, seria muito ruim. Se o código acima foi gravado em uma Activity. Como você está usando uma classe interna não estática (anônima), que contém implicitamente a referência da instância anexa. Isso causará vazamento de memória.
Além disso, se você mantiver o ouvinte como um campo, poderá usar registerOnSharedPreferenceChangeListener no início e chamar unregisterOnSharedPreferenceChangeListener no final. Mas você não pode acessar uma variável local em um método fora de seu escopo. Então você só tem a oportunidade de se registrar, mas não tem a chance de cancelar o registro do ouvinte. Assim, o uso do WeakHashMap resolverá o problema. É assim que eu recomendo.
Se você criar a instância do listener como um campo estático, evitará o vazamento de memória causado pela classe interna não estática. Mas, como os ouvintes podem ser múltiplos, deve ser relacionado à instância. Isso reduzirá o custo de manipulação do retorno de chamada onSharedPreferenceChanged .
fonte
Ao ler os dados legíveis do Word compartilhados pelo primeiro aplicativo, devemos
Substituir
com
no segundo aplicativo para obter valor atualizado no segundo aplicativo.
Mas ainda não está funcionando ...
fonte