5 votes

Suis-je en train de divulguer du Contexte ?

Je mets des alarmes dans mon application en utilisant AlarmManager à partir de plusieurs Activités.

Pour éviter le code redondant, j'ai créé la classe suivante :

public class CustomAlarmManager {

    private static final String SHARED_PREF_REQUEST_CODE = "requestCode";
    private static final String KEY_REQUEST_CODE = "kRequestCode";

    private CustomAlarmManager() {
    }

    public static void setNewAlarm(Context context, long timeInMillis) {
        Intent intent = new Intent(SomeOtherClass.ALARM_ACTION);
        intent.putExtra(SomeOtherClass.KEY_ALARM_TIME, timeInMillis);

        PendingIntent pendingIntent = PendingIntent.getBroadcast(
                context.getApplicationContext(),
                getNewCode(context),
                intent,
                PendingIntent.FLAG_ONE_SHOT);
        AlarmManager am = (AlarmManager) context.getSystemService(ALARM_SERVICE);

        if (Build.VERSION.SDK_INT >= 23) {
            am.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP,
                timeInMillis, pendingIntent);
        } else if (Build.VERSION.SDK_INT >= 19) {
            am.setExact(AlarmManager.RTC_WAKEUP, timeInMillis, pendingIntent);
        } else {
            am.set(AlarmManager.RTC_WAKEUP, timeInMillis, pendingIntent);
        }
    }

    // this method is for generating unique int values
    // for the requestCode param of PendingIntent.getBroadcast()
    private static int getNewCode(Context context) {
        SharedPreferences prefs = context.getSharedPreferences(
            SHARED_PREF_REQUEST_CODE, MODE_PRIVATE);
        int oldCode = prefs.getInt(KEY_REQUEST_CODE, Integer.MIN_VALUE);
        int newCode = ++oldCode;
        prefs.edit().putInt(KEY_REQUEST_CODE, newCode).apply();

        return newCode;
    }
}

Donc quand je veux définir une alarme, je peux simplement appeler ce qui suit de n'importe où dans mon application :

CustomAlarmManager.setNewAlarm(unContexte, someTimeInMillis);

Ma question :

Devrais-je m'inquiéter de la fuite du Context ici ?

Je ne conserve pas de référence à celui-ci, donc je pense que c'est bon, mais je ne suis pas sûr.

Est-ce une bonne approche ?

2voto

csenga Points 811

Devrais-je m'inquiéter de divulguer le Context ici?

Certainement pas.

Vous passez le contexte à la méthode et faites votre travail avec lui à cet endroit. Vous ne le stockez même pas ou ne l'utilisez pas ultérieurement, ce qui pourrait être la source du problème dans ce cas.

2voto

Amir Ziarati Points 5758

Je pense qu'il n'y a pas de problème.

Le problème de fuite se produit normalement lorsque vous avez besoin qu'une tâche soit effectuée à l'avenir et que vous conservez une référence à un objet actuellement disponible (qui peut être supprimé avant que cette tâche ne se produise).

Cela se produit également si un objet de classe interne non statique est envoyé en tant que paramètre à utiliser à un moment précis dans le futur. Comme la classe interne non statique conserve une référence à son père, cela va provoquer une grande fuite de mémoire.

1- vous n'avez pas conservé de référence à votre contexte pour votre tâche future

2- vous n'avez pas utilisé de classe interne et avez fait de votre classe un fichier séparé et les méthodes sont statiques.

Alors assurez-vous que vous êtes en sécurité et en bonne santé ;)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X