2011-04-20 3 views
9

Lorsque mon application passe en arrière-plan, mes objets (statique et singleton) sont effacés. J'ai donc essayé de stocker ces objets dans Applicaton Context. J'utilise le code suivant. Accounts.create (getApplicationContext()) sera appelé une fois pour stocker l'instance de comptes. Est-ce possible (fiable) pour stocker des objets dans le contexte d'application?Stocker des objets dans ApplicationContext

Est-ce possible (fiable) pour stocker des objets dans le contexte d'application? Je ne suis pas sûr que la manière suivante soit correcte ou non. s'il vous plaît guider ..

public class Init extends Application { 
    private Hashtable<Object, Object> globalStore = new Hashtable<Object, Object>(); 

    public void putToGlobalStore(Object key, Object value) { 
     globalStore.put(key, value); 
    } 

    public Object takeFromGlobalStore(Object key) { 
     return this.globalStore.get(key); 
    } 

    public void removeFromGlobalStore(Object key) { 
     this.globalStore.remove(key); 
    } 

    public boolean containsInGlobalStore(Object key) { 
     return this.globalStore.containsKey(key); 
    } 
} 

public class Accounts { 

     protected Accounts(String name, Context context) { 
      Init init = (Init) applicationContext; 
       init.putToGlobalStore(name, this); 
     } 

     private static Init applicationContext; 

     public static void create(Context context) { 

      if (context instanceof Application) 
       applicationContext = (Init) context; 
      else 
       applicationContext = (Init) context.getApplicationContext(); 

      if (applicationContext.containsInGlobalStore(GLOBAL_NAME)) 
       Logger.log("Warning " + GLOBAL_NAME 
         + " is already created. This will remove all old datas"); 

      new Accounts(GLOBAL_NAME, applicationContext); 


     } 

     private static final String GLOBAL_NAME = "accounts"; 

     public static Accounts getInstance() { 

      try { 
       return (Accounts) applicationContext 
         .takeFromGlobalStore(GLOBAL_NAME); 
      } catch (Exception e) { 
       Logger.log("GLOBAL_NAME Lost"); 
       return null; 
      } 

     } 

S'il vous plaît aider.

Répondre

11

Il faut savoir que le contexte de l'application elle-même est détruit si elle reste inutilisée pendant longtemps en arrière-plan. Il n'y a donc aucune garantie que vos objets statiques et singleton ne seront pas effacés lorsque l'application est en arrière-plan. Au lieu de cela, vous pouvez persister de temps en temps vos objets (dans une base de données ou un fichier plat ou une base de données) et les restaurer dans la méthode onCreate de la classe Application

1

Application clas s n'est pas permanent.

Si le processus de l'application est arrêté, Perte de données de la variable d'appartenance privée de classe d'application.

Using Shared Preferences.

+0

Merci pour la réponse. Ce dont j'ai besoin est de stocker des données à travers l'application quand elle est en cours d'exécution –

2

J'ai utilisé cette méthode dans mon application et je n'ai vu aucun problème à moins que mon processus ne soit tué par le système d'exploitation ou s'il y a un plantage dans mon application et que mon application soit redémarrée.

Si vous pensez que les données que vous stockez sont valables uniquement pour la durée de vie d'un programme, pourquoi ne surchargez-vous pas l'objet OnCreate of Application et créez-y toutes vos singletons. De cette façon, vous pouvez toujours vous assurer que votre application a tous les singletons avant que votre application ne commence à fonctionner.

+0

Oui, je fais l'initialisation dans le onCreate() de l'application. Mais après quelque temps quand l'application est en arrière-plan, j'obtiens l'instance de l'objet (disons Comptes), mais toutes les données stockées dans l'objet sont effacées. Chose intéressante est que je peux simuler ce problème dans 2.3.3, pas dans tous les appareils –

+1

Vous avez peut-être déjà essayé, mais si vous n'avez pas pourquoi vous ne surchargez pas la méthode onDestroy et ajoutez un peu de journalisation pour voir quand l'objet est en train d'être détruit. Ajoutez également une connexion à votre onCreate et à la méthode où vous stockez les comptes dans la table de hachage, etc. Autre chose non liée, mais si cet objet est utilisé depuis plusieurs threads, utilisez un ConcurrentHashMap au lieu de HashMap . Faites-moi savoir wat que vous trouvez heureux d'aider :) – Naresh

0

Je sais que cette question a été posée il y a longtemps, mais voici un good article qui suggère que l'utilisation de l'objet Application pour stocker des données n'est généralement pas une méthodologie de conception sonore.

Questions connexes