web-dev-qa-db-fra.com

Comment placer le contexte d'activité dans un Android sans classe d'activité?

J'ai une classe d'activité à partir de laquelle je transmets des informations à une classe d'assistance (non-activité). Dans la classe d'assistance, je veux utiliser la fonction getSharedPreferences(). Mais je ne peux pas l'utiliser car il nécessite le contexte de l'activité.

voici mon code:

  class myActivity extends Activity
    {
    @Override
        protected void onCreate(Bundle savedInstanceState) 
        {

            // TODO Auto-generated method stub
            super.onCreate(savedInstanceState);
            setContentView(R.layout.home);


            Info = new Authenticate().execute(ContentString).get();
            ItemsStore.SetItems(Info);

        }

    }

class ItemsStore
{
  public void SetItems(Information info)
 {
  SharedPreferences  localSettings = mContext.getSharedPreferences("FileName", Context.MODE_PRIVATE);
            SharedPreferences.Editor editor = localSettings.edit();
            editor.putString("Url", info.Url);
            editor.putString("Email", info.Email);
 }
}

UNE idée de comment cela peut être réalisé?

11
user3354605

Essaye ça:

class myActivity extends Activity
{
    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {

        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.home);


        Info = new Authenticate().execute(ContentString).get();
        ItemsStore.SetItems(Info, getApplicationContext());

    }

}

class ItemsStore
{
   public void SetItems(Information info, Context mContext)
   {
            SharedPreferences  localSettings = mContext.getSharedPreferences("FileName",
            Context.MODE_PRIVATE);
            SharedPreferences.Editor editor = localSettings.edit();
            editor.putString("Url", info.Url);
            editor.putString("Email", info.Email);
   }
}
10
Mohammad Ashfaq

Au lieu de créer des fuites de mémoire (en maintenant le contexte d'activité dans un champ de classe), vous pouvez essayer cette solution car les préférences partagées n'ont pas besoin de contexte d'activité mais ... de tout contexte :) Pour les objets à longue durée de vie, vous devez utiliser ApplicationContext.

Créez la classe d'application:

public class MySuperAppApplication extends Application {
    private static Application instance;

    @Override
    public void onCreate() {
        super.onCreate();
        instance = this;
    }

    public static Context getContext() {
        return instance.getApplicationContext();
    }
}

Enregistrez-le sur le manifeste

<application
    ...
    Android:name=".MySuperAppApplication" >
    ...
</application>

Ensuite, vous pouvez faire quelque chose comme ça

public void persistItems(Information info) {
    Context context = MySuperAppApplication.getContext();
    SharedPreferences sharedPreferences = context.getSharedPreferences("urlPersistencePreferences", Context.MODE_PRIVATE);
    sharedPreferences.edit()
        .putString("Url", info.Url)
        .putString("Email", info.Email);
}

La signature de la méthode est meilleure de cette façon car elle n'a pas besoin de contexte externe. Cela peut être caché sous une interface. Vous pouvez également l'utiliser facilement pour l'injection de dépendances.

HTH

25
Gaskoin

Vous devez passer le contexte au constructeur de la classe non activité

ItemsStore itemstore = new ItemStore(myActivity.this);
itemstore.SetItems(Info);

Ensuite

Context mContext;
public ItemsStore (Context context)
{
       mContext =context;
}

mContext peut maintenant être utilisé comme contexte d'activité.

Remarque: Ne conservez pas de références de longue durée à une activité de contexte (une référence à une activité doit avoir le même cycle de vie que l'activité elle-même)

6
Raghunandan

Écrivez une fonction publique dans votre activité. Lors de la création d'une instance de votre classe d'assistance dans la classe Activity, passez le contexte de l'activité dans le constructeur.

Ensuite, à partir de votre classe d'assistance, en utilisant le contexte d'activité, appelez la fonction publique dans la classe d'activité.

0
Sushil