Lembrando esta postagem enumerando vários problemas do uso de singletons e tendo visto vários exemplos de aplicativos Android usando o padrão singleton, pergunto-me se é uma boa idéia usar Singletons em vez de instâncias únicas compartilhadas pelo estado global do aplicativo (subclassificando android.os.Application e obtê-lo através de context.getApplication ()).
Que vantagens / desvantagens teriam ambos os mecanismos?
Para ser sincero, espero a mesma resposta neste post Padrão Singleton com aplicativo Web, Não é uma boa ideia! mas aplicado ao Android. Estou correcto? O que há de diferente no DalvikVM?
EDIT: Gostaria de ter opiniões sobre vários aspectos envolvidos:
- Sincronização
- Reutilização
- Teste
fonte
Eu recomendo muito singletons. Se você tem um singleton que precisa de um contexto, tenha:
Eu prefiro singletons do que Application, porque ajuda a manter um aplicativo muito mais organizado e modular - em vez de ter um lugar em que todo o seu estado global no aplicativo precisa ser mantido, cada peça separada pode se cuidar. Também é bom o fato de os singletons inicializarem preguiçosamente (a pedido) em vez de levá-lo no caminho de fazer toda a inicialização antecipada em Application.onCreate ().
Não há nada intrinsecamente errado em usar singletons. Apenas use-os corretamente, quando fizer sentido. A estrutura do Android, na verdade, possui muitas delas, para manter caches por processo de recursos carregados e outras coisas.
Também para aplicativos simples, o multithreading não se torna um problema para os singletons, porque, por design, todos os retornos de chamada padrão do aplicativo são despachados no encadeamento principal do processo, para que você não aconteça o multi-threading, a menos que o introduza explicitamente através de encadeamentos ou implicitamente, publicando um IBinder de provedor ou serviço de conteúdo para outros processos.
Apenas pense bem no que está fazendo. :)
fonte
De: desenvolvedor> referência - aplicativo
fonte
O aplicativo não é o mesmo que o Singleton. Os motivos são:
fonte
Eu tive o mesmo problema: Singleton ou criar uma subclasse android.os.Application?
Primeiro, tentei com o Singleton, mas meu aplicativo, em algum momento, chama o navegador
e o problema é que, se o aparelho não tiver memória suficiente, a maioria das suas aulas (até Singletons) é limpa para obter um pouco de memória; portanto, ao retornar do navegador para o meu aplicativo, ele falha sempre.
Solução: coloque os dados necessários dentro de uma subclasse da classe Application.
fonte
Considere os dois ao mesmo tempo:
Além disso, sugiro que você expanda seu Contexto para incluir não apenas o acesso a objetos singleton, mas algumas funcionalidades que precisam ser acessadas globalmente, como por exemplo: context.logOffUser (), context.readSavedData (), etc. Provavelmente renomeando o Contexto para Fachada faria sentido então.
fonte
Eles são realmente iguais. Há uma diferença que eu posso ver. Com a classe Application, você pode inicializar suas variáveis em Application.onCreate () e destruí-las em Application.onTerminate (). Com o singleton, você precisa confiar na inicialização e destruição de estática da VM.
fonte
Meus 2 centavos:
Notei que alguns campos estáticos / singleton foram redefinidos quando minha atividade foi destruída. Notei isso em alguns dispositivos 2.3 low-end.
Meu caso foi muito simples: eu apenas tenho um arquivo "init_done" particular e um método estático "init" que chamei de activity.onCreate (). Percebo que o método init estava se re-executando em alguma recriação da atividade.
Embora eu não possa provar minha afirmação, ela pode estar relacionada a QUANDO o singleton / classe foi criado / usado primeiro. Quando a atividade é destruída / reciclada, parece que todas as classes que apenas essa atividade se referem também são recicladas.
Mudei minha instância de singleton para uma subclasse de aplicativo. Eu os acesso a partir da instância do aplicativo. e, desde então, não percebeu o problema novamente.
Espero que isso possa ajudar alguém.
fonte
Da boca do proverbial cavalo ...
Ao desenvolver seu aplicativo, você pode achar necessário compartilhar dados, contexto ou serviços globalmente em seu aplicativo. Por exemplo, se seu aplicativo tiver dados de sessão, como o usuário conectado no momento, é provável que você exponha essas informações. No Android, o padrão para resolver esse problema é ter sua instância android.app.Application como proprietária de todos os dados globais e, em seguida, tratar sua instância de Aplicativo como um singleton com acessadores estáticos para os vários dados e serviços.
Ao escrever um aplicativo Android, você garante apenas uma instância da classe android.app.Application e, portanto, é seguro (e recomendado pela equipe do Google Android) tratá-lo como um singleton. Ou seja, você pode adicionar com segurança um método estático getInstance () à sua implementação de Aplicativo. Igual a:
fonte
Minha atividade chama finish () (que não faz com que termine imediatamente, mas acabará eventualmente) e chama o Google Street Viewer. Quando eu depuro no Eclipse, minha conexão com o aplicativo é interrompida quando o Street Viewer é chamado, que eu entendo como o aplicativo (inteiro) sendo fechado, supostamente para liberar memória (pois uma única atividade concluída não deve causar esse comportamento) . No entanto, sou capaz de salvar o estado em um Bundle via onSaveInstanceState () e restaurá-lo no método onCreate () da próxima atividade na pilha. Usando um Aplicativo estático de singleton ou subclasse, eu enfrento o estado de fechamento e perda do aplicativo (a menos que eu o salve em um Pacote configurável). Então, pela minha experiência, eles são os mesmos em relação à preservação do estado. Percebi que a conexão está perdida no Android 4.1.2 e 4.2.2, mas não no 4.0.7 ou 3.2.4,
fonte