Pergunta

Estou trabalhando em um aplicativo Android bastante complexo que requer uma quantidade um pouco grande de dados sobre o aplicativo (eu diria que um total de cerca de 500kb - isso é grande para um dispositivo móvel?). Pelo que posso dizer, qualquer mudança de orientação no aplicativo (na atividade, para ser mais precisa) causa uma destruição e recreação completas da atividade. Com base nas minhas descobertas, a classe de aplicativo não possui o mesmo ciclo de vida (ou seja, é, para todos os efeitos, sempre instanciados). Faz sentido armazenar as informações do estado dentro da classe de aplicativos e, em seguida, referenciá -las da atividade, ou esse geralmente não é o método "aceitável" devido a restrições de memória em dispositivos móveis? Eu realmente aprecio qualquer conselho sobre este tópico. Obrigado!

Foi útil?

Solução

Eu não acho que 500kb serão tão importantes.

O que você descreveu é exatamente como abordei meu problema de perder dados em uma atividade. Criei um singleton global na aula de aplicativos e pude acessá -la a partir das atividades que usei.

Você pode transmitir dados em um singleton global se for muito usado.

public class YourApplication extends Application 
{     
     public SomeDataClass data = new SomeDataClass();
}

Em seguida, chame -o de qualquer atividade:

YourApplication appState = ((YourApplication)this.getApplication());
appState.data.UseAGetterOrSetterHere(); // Do whatever you need to with the data here.

Eu discuto isso Aqui na minha postagem no meu blog, sob a seção "Global Singleton".

Outras dicas

Aqueles que contam com Application instância estão errados. A princípio, pode parecer que o Application Existe enquanto existir todo o processo do aplicativo, mas isso é uma suposição incorreta.

O sistema operacional pode matar processos conforme necessário. Todos os processos são divididos em 5 níveis de "matança" especificado no documento.

Assim, por exemplo, se o seu aplicativo entrar em segundo plano devido ao usuário que responde a uma chamada recebida, dependendo do estado da RAM, o sistema operacional pode (ou não) matar seu processo (destruindo o Application instância no processo).

Eu acho que uma abordagem melhor seria persiste seus dados em arquivo de armazenamento interno e depois leia quando sua atividade recomeçar.

ATUALIZAR:

Recebi muitos feedbacks negativos, então é hora de adicionar um esclarecimento. :) Bem, inicialmente eu realmente usei uma suposição errada de que o estado é realmente importante para o aplicativo. No entanto, se o seu aplicativo estiver bom que às vezes o estado seja perdido (pode ser algumas imagens que serão apenas releitivas/reduzidas), então é totalmente bom mantê -lo como membro de Application.

Se você deseja acessar o "Singleton Global" fora de uma atividade e não quer passar pelo Context Através de todos os objetos envolvidos para obter o Singleton, você pode definir um atributo estático na sua classe de aplicativo, que mantém a referência a si mesma. Basta inicializar o atributo no onCreate() método.

Por exemplo:

public class ApplicationController extends Application {
    private static ApplicationController _appCtrl;

    public static ApplicationController getAppCtrl()
    {
         return _appCtrl;
    }
}

Porque subclasses de Application Também pode obter os recursos, você pode acessá -los simplesmente quando definir um método estático, que os devolve, como:

public static Resources getAppResources()
{
    return _appCtrl.getResources();
}

Mas tenha muito cuidado ao passar em torno de referências de contexto para Evite vazamentos de memória.

Dave, que tipo de dados é esse? Se são dados gerais que se referem ao aplicativo como um todo (exemplo: dados do usuário), estenda a classe de aplicativo e armazenem -os lá. Se os dados se referem à atividade, você deverá usar os manipuladores OnsaveInstancestate e OnRestoreInstanCestate para persistir os dados na rotação da tela.

Você pode substituir a funcionalidade de orientação para garantir que sua atividade não seja destruída e recriada. Olhar aqui.

Você pode criar a classe de aplicativo e salvar todos os dados sobre esse CALSS para uso que em qualquer lugar do seu aplicativo.

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