2016-10-11 23 views
5

Tôi đang đặt báo thức trong ứng dụng của mình bằng cách sử dụng AlarmManager từ nhiều Hoạt động.Tôi có bị rò rỉ Bối cảnh không?

Để tránh mã dư thừa, tôi tạo ra lớp sau:

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

Vì vậy, khi tôi muốn thiết lập một báo thức, tôi chỉ có thể gọi sau đây từ bất cứ nơi nào trong ứng dụng của tôi:

CustomAlarmManager.setNewAlarm(aContext, someTimeInMillis); 

Câu hỏi của tôi:

Tôi có phải lo lắng về việc rò rỉ Context tại đây không?

Tôi không lưu trữ một tham chiếu đến nó, vì vậy tôi nghĩ rằng tôi là tốt, nhưng tôi không chắc chắn.

Đây có phải là cách tiếp cận tốt không?

+0

Bạn thậm chí còn sử dụng ứng dụngĐối với trường hợp vừa đủ;) tuyệt vời;) được thực hiện tốt. –

Trả lời

2

Tôi nghĩ rằng không có bất kỳ vấn đề gì.

Sự cố rò rỉ thường xảy ra khi bạn cần thực hiện một số tác vụ trong tương lai và giữ tham chiếu đến đối tượng có sẵn có thể bị hủy trước khi tác vụ đó xảy ra).

Điều này cũng xảy ra nếu đối tượng lớp bên trong không tĩnh được gửi dưới dạng thông số được sử dụng trong một thời điểm cụ thể trong tương lai. Kể từ khi lớp bên trong không tĩnh giữ một tham chiếu đến cha của nó sẽ là một rò rỉ bộ nhớ lớn.

1- bạn didnt giữ bất kỳ tham chiếu đến ngữ cảnh của bạn cho công việc tương lai của bạn

2- bạn didnt sử dụng một lớp bên trong và làm cho lớp học của bạn như là một file riêng biệt và phương pháp tĩnh.

Vì vậy, hãy đảm bảo bạn an toàn và có âm thanh;)

2

Tôi có phải lo lắng về việc rò rỉ Bối cảnh tại đây không?

Chắc chắn là không.

Bạn chuyển số context vào phương thức và thực hiện công việc của mình ngay tại đó. Bạn thậm chí không lưu trữ nó hoặc sử dụng nó sau này có thể là gốc rễ của cái ác trong trường hợp này.

Các vấn đề liên quan