Com o lançamento do Gingerbread, tenho feito experiências com algumas das novas APIs, sendo uma delas o StrictMode .
Percebi que um dos avisos é para getSharedPreferences()
.
Este é o aviso:
StrictMode policy violation; ~duration=1949 ms: android.os.StrictMode$StrictModeDiskReadViolation: policy=23 violation=2
e está sendo fornecido para uma getSharedPreferences()
chamada sendo feita no thread de interface do usuário.
O SharedPreferences
acesso e as alterações devem realmente ser feitos fora do thread da IU?
android
sharedpreferences
android-strictmode
CottonBallPaws
fonte
fonte
Respostas:
Estou feliz que você já está brincando com ele!
Algumas coisas a serem observadas: (na forma de marcador preguiçoso)
Em relação ao carregamento, porém ...
uma vez carregados, SharedPreferences são singletons e armazenados em cache em todo o processo. portanto, você deseja carregá-lo o mais cedo possível para mantê-lo na memória antes de precisar dele. (presumindo que seja pequeno, como deveria ser se você estiver usando SharedPreferences, um arquivo XML simples ...) Você não quer culpá-lo no futuro, se algum usuário clicar em um botão.
mas sempre que você chamar context.getSharedPreferences (...), o arquivo XML de apoio é estatizado para ver se ele mudou, então você vai querer evitar essas estatísticas durante os eventos da IU de qualquer maneira. Um stat normalmente deve ser rápido (e frequentemente armazenado em cache), mas yaffs não tem muita concorrência (e muitos dispositivos Android rodam em yaffs ... Droid, Nexus One, etc.) então se você evitar o disco , você evita ficar preso atrás de outras operações de disco pendentes ou em andamento.
então provavelmente você desejará carregar o SharedPreferences durante seu onCreate () e reutilizar a mesma instância, evitando o stat.
mas se você não precisa de suas preferências durante onCreate (), esse tempo de carregamento está atrasando a inicialização do seu aplicativo desnecessariamente, então geralmente é melhor ter algo como uma subclasse FutureTask <SharedPreferences> que inicia um novo thread para .set () o valor das subclasses de FutureTask. Em seguida, basta consultar o membro FutureTask <SharedPreferences> sempre que precisar e .get (). Pretendo tornar isso gratuito nos bastidores do Honeycomb, de forma transparente. Tentarei lançar algum código de amostra que mostre as melhores práticas nesta área.
Verifique o blog de desenvolvedores Android para as próximas postagens sobre assuntos relacionados ao StrictMode nas próximas semanas.
fonte
O acesso às preferências compartilhadas pode levar algum tempo porque elas são lidas do armazenamento flash. Você lê muito? Talvez você possa usar um formato diferente, por exemplo, um banco de dados SQLite.
Mas não conserte tudo que você encontrar usando StrictMode. Ou para citar a documentação:
fonte
Uma sutileza sobre a resposta de Brad: mesmo se você carregar o SharedPreferences em onCreate (), provavelmente ainda deve ler os valores no thread de segundo plano porque getString () etc. bloqueia até ler a preferência de arquivo compartilhado em termina (em um thread de segundo plano):
edit () também bloqueia da mesma maneira, embora apply () pareça ser seguro no thread de primeiro plano.
(Aliás, sinto muito por colocar isso aqui. Eu teria colocado isso como um comentário à resposta de Brad, mas acabei de entrar e não tenho reputação suficiente para fazer isso.)
fonte
Eu sei que esta é uma questão antiga, mas quero compartilhar minha abordagem. Tive longos tempos de leitura e usei uma combinação de preferências compartilhadas e a classe de aplicativo global:
ApplicationClass:
LocalPreference:
MainActivity (atividade que é chamada primeiro em seu aplicativo):
Etapas explicadas:
NOTA: SEMPRE verifique se uma variável ampla do aplicativo é diferente de NULL, motivo -> http://www.developerphil.com/dont-store-data-in-the-application-object/
Se eu não tivesse verificado em null, permitiria que um nullpointer fosse lançado ao chamar, por exemplo, getMaxDistance () no objeto de filtro (se o objeto do aplicativo foi deslocado da memória pelo Android)
fonte
A classe SharedPreferences faz algumas leituras e gravações em arquivos XML no disco, portanto, como qualquer outra operação de IO, ela pode estar bloqueando. A quantidade de dados armazenados atualmente em SharedPreferences afeta o tempo e os recursos consumidos pelas chamadas de API. Para quantidades mínimas de dados, é uma questão de alguns milissegundos (às vezes até menos de um milissegundo) para obter / colocar os dados. Mas, do ponto de vista de um especialista, pode ser importante melhorar o desempenho fazendo chamadas de API em segundo plano. Para um SharedPreferences assíncrono, sugiro verificar a biblioteca Datum .
fonte