Pergunta

Eu sou a criação de evento de aplicativo de pesquisa, temos um conjunto de critérios de pesquisa a partir de uma tela preencher em outra tela, em seguida, o usuário pode editar critérios de pesquisa a partir de 3 de tela e vai para a 4ª tela.

Para conseguir a tarefa acima eu estou usando o objeto estático que lembrar-se dos valores em torno da aplicação e não preciso de fazer qualquer coisa extra.

Mas estou com medo de se acerca do objeto estático ciclo de vida do android se de falta de memória encontrado android excluir objetos estáticos ???

Como o android suporta multi-tasking, se o usuário alterna para outro aplicativo e quando o usuário voltar aplicação de começar a agir louco, não objeto estático obter removidos quando ele é multi-tarefa ???alguma idéia ??e também sugerir manter estático objeto através do método singleton é a melhor abordagem ???

Foi útil?

Solução

Vamos começar com um pouco de fundo: o que acontece quando você inicia um aplicativo?
O sistema operacional inicia um processo e atribui um ID de processo exclusivo e aloca uma tabela de processos. Um processo inicia uma instância do DVM (Dalvik VM); Cada aplicativo é executado dentro de um DVM.
Um DVM gerencia o carregamento de classe de classe, ciclo de vida da instância, GC etc.

Lifetime de uma variável estática: uma variável estática surge quando uma classe é carregada pela JVM e morre quando a classe é descarregada.

Portanto, se você criar um aplicativo Android e inicializar uma variável estática, ele permanecerá na JVM até que um dos seguintes a seguir aconteça:
1. A classe é descarregada
2. A JVM é desligada
3. O processo morre

Observe que o valor da variável estática persistirá quando você mudar para uma atividade diferente de outro aplicativo e nenhum dos três acima acontece. Se qualquer um dos três acima acontecer, o estático perderá seu valor.

Você pode testar isso com algumas linhas de código:

  1. Imprima a estática não -inicializada em OnCreate de sua atividade -> deve imprimir nulo
  2. Inicialize a estática. imprimir -> valor não seria nulo
  3. Aperte o botão traseiro e vá para a tela inicial. Nota: a tela inicial é outra atividade.
  4. Inicie sua atividade novamente -> A variável estática não será nula
  5. Mate seu processo de inscrição no DDMS (botão de parada na janela Dispositivos).
  6. Reinicie sua atividade -> A estática terá valor nulo.

Espero que ajude.

Outras dicas

Bem, o padrão Singleton é também baseada na utilização de variáveis estáticas então, na verdade você estaria na mesma posição.Enquanto a abordagem estática pode funcionar na maioria das vezes, pode acontecer que, em alguns casos, quando a memória está cheia e outra atividade assume o primeiro plano, antes de sua aplicação passa para a próxima tela, a sua atividade do processo poderia ser morto e você perde os valores estáticos.No entanto, o Android oferece algumas opções de persistência de valores entre os estados ou transmiti-las, tais como:

  • usando a Intenção, você pode passar ao longo de os critérios de pesquisa de atividade atividade (semelhante a um web http pedido)
  • usando o aplicativo de preferências, você pode guardar os valores e recuperar - os na atividade que precisa deles
  • usando o banco de dados sqlite, você pode mantê-los em uma tabela e recuperar eles mais tarde
  • se você só precisa salvar atividade o estado, de forma que na reinicialização, os campos obter cheio anteriormente os valores selecionados, você pode implementar o onSaveInstanceState() atividade método - note que este não é entre as atividades recomendadas para persistência de estados.

Você pode obter alguns exemplos de código do uso de preferências, intenções e o banco de dados sqlite observando o aegis-escudo árvore de código de origem no google código ou em outras open source Android aplicações.

Depois de algumas pesquisas, acontece que usar o aplicativo para armazenar singletons não é uma ideia tão grande, a menos que você esteja pronto para recriá -lo:

Não armazene dados no objeto de aplicativo

por enquanto a resposta aceita é tecnicamente correto, ele não fornece todas as informações.

Como o link acima sugere, se você realmente deseja manter esse modelo, precisa estar pronto para verificar se há NULL e recriar os dados, se possível.

@r1k0 está aqui.O armazenamento de dados em campos estáticos de uma classe não persistem sobre a sua própria, através do processo de aplicação de mata e reinicia.Android rotineiramente processos (execução de aplicativos) quando ela precisa de memória.

Por que o Android doc: Estado de atividade e de ejeção de memória,

O sistema nunca mata uma atividade diretamente.Em vez disso, ele mata os processo no qual a atividade será executada, destruindo não só a atividade mas tudo o resto execução no processo, como bem.

Você pode salvar e restaurar o estado do primitivos bem Serializable e Parcelable objetos usando os métodos a seguir.Estas são automaticamente chamados durante a atividade normal do ciclo de vida.

protected void onSaveInstanceState(Bundle state) {}
protected void onRestoreInstanceState(Bundle savedInstanceState){}

Então, se você tem uma classe que tem apenas variáveis estáticas, você pode salvar o estado de cada campo em onSaveInstanceState() e restaurá-los em onRestoreInstanceState().Quando o Android mata o processo que o aplicativo estiver em execução, o estado das variáveis será salvo, e quando o Android restaura a sua aplicação, os valores serão restaurados na memória no mesmo estado de antes.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top