在for循环中创建一个新的意图好还是坏?

时间:2016-09-01 12:22:51

标签: java android android-intent

我目前仍然坚持这个问题,如果在for循环中创建一个新的意图是好还是坏。我有以下情况:

1

public static void reactivateReminders(Schedule schedule) {
    ArrayList<Lecture> allLectures = schedule.getAllLectures();

    for(Lecture lecture : allLectures) {
        ...
        // Set up various things for the reminder
        ...
        Intent intent = new Intent(getApplicationContext(), ReminderReceiver.class);
        String at = getResources().getString(R.string.at);
        String with = getResources().getString(R.string.with);
        String beginH = ScheduleHelper.formatNumber(changedBeginH);
        String beginM = ScheduleHelper.formatNumber(changedBeginM);
        String room = lecture.getRoom();
        intent.putExtra("contentText", at + " " + beginH + ":" + beginM + " in " + room + " " + with + " " + lecture.getLecturer());

        PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), lecture.getAlarmId(), intent, 0);//PendingIntent.FLAG_UPDATE_CURRENT);
        AlarmManager alarm = (AlarmManager) getSystemService(ALARM_SERVICE);

        if(lecture.getBeginH() != beginH || lecture.getBeginM() != beginM)
            alarm.cancel(pendingIntent);

        alarm.setInexactRepeating(AlarmManager.RTC, calendar.getTimeInMillis() + offset, 1000 * 60 * 60 * 24 * 7, pendingIntent);
    }
}

2

public static void reactivateReminders(Schedule schedule) {
    ArrayList<Lecture> allLectures = schedule.getAllLectures();
    Intent intent = new Intent(getApplicationContext(), ReminderReceiver.class);

    for(Lecture lecture : allLectures) {
        ...
        // Set up various things for the reminder
        ...
        String at = getResources().getString(R.string.at);
        String with = getResources().getString(R.string.with);
        String beginH = ScheduleHelper.formatNumber(changedBeginH);
        String beginM = ScheduleHelper.formatNumber(changedBeginM);
        String room = lecture.getRoom();
        intent.putExtra("contentText", at + " " + beginH + ":" + beginM + " in " + room + " " + with + " " + lecture.getLecturer());

        PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), lecture.getAlarmId(), intent, 0);//PendingIntent.FLAG_UPDATE_CURRENT);
        AlarmManager alarm = (AlarmManager) getSystemService(ALARM_SERVICE);

        if(lecture.getBeginH() != beginH || lecture.getBeginM() != beginM)
            alarm.cancel(pendingIntent);

        alarm.setInexactRepeating(AlarmManager.RTC, calendar.getTimeInMillis() + offset, 1000 * 60 * 60 * 24 * 7, pendingIntent);
    }
}

哪个选项更好?我不太熟悉Java,所以我不知道Java如何处理任何一个。也许并没有什么不同,但因为我正在用C ++编程,所以在循环中创建新对象让我很担心。

感谢您提前提供任何帮助。

编辑:结论
正如Alex Shutov所提到的,最好不要立即设置所有提醒。用户可能只需要下一个即将到来的用户。

要实现这一点,您应该在应用程序中的某个位置设置最早的提醒,并将其他提醒(或者您使用的数据)存储在应用程序外部的某些位置(XML,SQL,...),以便在最早的提醒出发后,您的服务可以读取文件以加载下一个。

通过这样做,您不会给系统带来用户甚至不需要的提醒。我会尝试在某个时候实现这个想法,但现在我将使用我的方法。

关于我的代码:
对于我发布的代码,更好的方法是在循环外创建新的intent。由于我输入的额外密钥具有相同的密钥,因此每次都会覆盖,并且您不必创建新的意图。其他变量,如我的“at”和“with”,它们是常量,也可以放在循环之外。可以删除变量“beginH,beginM,room”,您可以直接在putExtra参数中调用函数。您还可以将PendingIntent和AlarmManager行放在循环外部。

我会发布代码,但我认为我的帖子太大了。 感谢您的快速帮助:)

1 个答案:

答案 0 :(得分:3)

这是一个坏主意,因为你用不必要的任务重载系统,你应该在IntentService计划下一个事件中安排最近的事件