Estou usando SharedPreferences
no meu aplicativo Android. Estou usando ambos commit()
e apply()
método de preferência compartilhada. Quando uso o AVD 2.3, ele não mostra erro, mas quando executo o código no AVD 2.1, o apply()
método mostra erro.
Então, qual é a diferença entre esses dois? E usando apenas commit()
posso armazenar o valor da preferência sem nenhum problema?
android
sharedpreferences
Andro Selva
fonte
fonte
apply()
fará de forma assíncrona a E / S de disco enquantocommit()
estiver síncrona. Portanto, você realmente não deve ligarcommit()
do thread da interface do usuário.apply()
ganha. Portanto, você pode usarapply()
em vez decommit()
segurança, se garantir que apenas um SharedPreferences.Editor esteja sendo usado pelo seu aplicativo.commit()
?Respostas:
apply()
foi adicionado na versão 2.3, ele confirma sem retornar um valor booleano indicando sucesso ou falha.commit()
retorna verdadeiro se o salvamento funcionar, falso caso contrário.apply()
foi adicionado quando a equipe de desenvolvedores do Android percebeu que quase ninguém notava o valor de retorno, portanto, aplicar é mais rápido e assíncrono.http://developer.android.com/reference/android/content/SharedPreferences.Editor.html#apply ()
fonte
tl; dr:
commit()
grava os dados de forma síncrona (bloqueando o thread do qual é chamado) Em seguida, ele informa sobre o sucesso da operação.apply()
agenda os dados para serem gravados de forma assíncrona . Ele não informa sobre o sucesso da operação.apply()
e ler imediatamente através de qualquer método getX, o novo valor será retornado!apply()
em algum momento e ele ainda estiver em execução, todas as chamadas paracommit()
serão bloqueadas até que todas as chamadas de aplicação anteriores e a chamada de confirmação atual sejam concluídas.Informações mais detalhadas da documentação SharedPreferences.Editor :
fonte
apply()
é assíncrono e as gravações pendentes bloqueiam futuras chamadas paracommit()
.Estou com alguns problemas ao usar apply () em vez de commit (). Conforme declarado anteriormente em outras respostas, o apply () é assíncrono. Estou com o problema de que as alterações formadas em uma preferência de "conjunto de cadeias" nunca são gravadas na memória persistente.
Isso acontece se você "forçar a detenção" do programa ou, na ROM que eu instalei no meu dispositivo com Android 4.1, quando o processo é encerrado pelo sistema devido a necessidades de memória.
Eu recomendo usar "commit ()" em vez de "apply ()" se você deseja que suas preferências estejam ativas.
fonte
Use apply ().
Ele grava as alterações na RAM imediatamente e aguarda e as grava no armazenamento interno (o arquivo de preferências real) depois. A confirmação grava as alterações de forma síncrona e direta no arquivo.
fonte
commit()
é síncrona,apply()
é assíncronaapply()
é a função nula.commit()
retorna true se os novos valores foram gravados com êxito no armazenamento persistente.apply()
garantias completas antes de mudar de estado, você não precisa se preocupar com os ciclos de vida dos componentes do AndroidSe você não usar o valor retornado
commit()
e estiver usando ocommit()
thread principal, use emapply()
vez decommit()
fonte
Os documentos dão uma boa explicação da diferença entre
apply()
ecommit()
:fonte
Partida javadoc:
fonte
Podemos ficar confusos com esses dois termos, quando estamos usando SharedPreference. Basicamente, eles provavelmente são os mesmos, então vamos esclarecer as diferenças de commit () e apply ().
apply()
confirma sem retornar um booleano indicando sucesso ou falha.commit(
) retorna verdadeiro se o salvamento funcionar, caso contrário, falso.apply()
é mais rápido.commit()
é mais lento.apply()
: Assíncronocommit()
: Síncronoapply()
: atômicocommit()
: atômicoapply()
: Nãocommit()
: Simfonte
apply()
"mais rápido" do quecommit()
? Representam essencialmente uma mesma tarefa que seria colocada no Looper do thread.commit()
coloca essa tarefa no Looper principal e aapply()
coloca em segundo plano, mantendo o looper principal livre da tarefa de E / S do disco.