2016-10-11 1 views
5

Ich setze Alarme in meiner App mit AlarmManager aus mehreren Aktivitäten.Lecke ich Kontext?

redundanten Code zu vermeiden, habe ich die folgende Klasse:

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; 
    } 
} 

Also, wenn ich einen Alarm einrichten möchten, kann ich rufen Sie die folgende von überall in meiner App:

CustomAlarmManager.setNewAlarm(aContext, someTimeInMillis); 

Meine Frage:

Sollte ich die Context über undichte hier Sorgen machen?

Ich speichere keine Referenz, also denke ich, dass ich gut bin, aber ich bin mir nicht sicher.

Ist das ein guter Ansatz?

+0

Sie auch application nur für den Fall verwendet wird;) das ist genial;) gut gemacht. –

Antwort

2

Ich denke, es gibt kein Problem.

Das Leckproblem tritt normalerweise auf, wenn Sie eine Aufgabe in der Zukunft ausführen müssen und Sie einen Verweis auf ein aktuell verfügbares Objekt haben (das möglicherweise beendet wird, bevor diese Aufgabe auftritt).

Dies geschieht auch, wenn ein nicht statisches inneres Klassenobjekt als Parameter gesendet wird, der in einer bestimmten Zeit in der Zukunft verwendet werden soll. Da die nicht statische innere Klasse einen Verweis auf ihren Vater enthält, wird es ein großes Speicherleck sein.

1- didnt Sie einen Hinweis auf Ihren Kontext für Ihre zukünftige Aufgabe

2- halten Sie nicht eine innere Klasse verwenden und aus Ihrer Klasse als separate Datei und Methoden sind statisch.

So sicher sein, Sie sicher und gesund sind;)

2

Muss ich mir Sorgen machen, den Kontext hier zu verlieren?

Definitiv nicht.

Sie übergeben die context an die Methode und machen Sie Ihre Arbeit damit genau dort. Sie speichern es nicht einmal oder verwenden es später, was in diesem Fall die Wurzel des Bösen sein könnte.

Verwandte Themen