Недостаточно памяти при восстановлении сигналов тревоги в JobIntentService()
Я настроил класс приемника вещания, который проверяет, когда загрузка завершена. После завершения загрузки предполагается начать JobIntentService
, Предполагается, что этот сервис извлекает данные тревоги из двух баз данных SQLite. Сервис работает, но проблема в том, что он выбрасывает Out of memory(OOM)
исключение при извлечении данных из баз данных SQLite и сбросе аварийных сигналов.
Класс JobIntentService:
class AlarmJobIntentService : JobIntentService() {
override fun onHandleWork(intent: Intent) {
val calendar: Calendar = Calendar.getInstance()
calendar.set(Calendar.YEAR, 1)
val mAlarmArrayList = DatabaseHelper.getAlarmDBInstance(this)?.readPendingAlarms()
val mAlarmNotesArrayList = DatabaseHelper.getNotesDBInstance(this)?.readAlarmNotesData()
for (alarms in mAlarmArrayList!!.iterator()) {
calendar.set(Calendar.YEAR, alarms["year"]!!)
calendar.set(Calendar.MONTH, alarms["month"]!!)
calendar.set(Calendar.DAY_OF_MONTH, alarms["day"]!!)
calendar.set(Calendar.HOUR_OF_DAY, alarms["hour"]!!)
calendar.set(Calendar.MINUTE, alarms["minute"]!!)
calendar.set(Calendar.SECOND, alarms["second"]!!)
val noteDetail: UserNotes = mAlarmNotesArrayList!!.elementAt(alarms["requestCode"]!!)
setReminder(calendar, noteDetail.noteTitle!!, noteDetail.noteText!!, noteDetail.noteReminderID!!)
}
}
private fun setReminder(calendar: Calendar, title: String, text: String, reqCode: Int) {
val alarmManager: AlarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager
val noteText = text.replace("[ ]", "☐").replace("[x]", "☑")
val intent = Intent(this, AlertReceiver::class.java) //transfer data to notification class
intent.putExtra("title", title)
intent.putExtra("text", noteText)
intent.putExtra("uniqueID", reqCode)
val pendingIntent: PendingIntent = PendingIntent.getBroadcast(this, reqCode, intent, 0)
alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.timeInMillis, pendingIntent)
}
}
Данные из 1-го SQlite
fun readAlarmNotesData(): ArrayList<UserNotes> {
val db: SQLiteDatabase = readableDatabase
val notes: ArrayList<UserNotes> = ArrayList()
val cursor: Cursor = db.rawQuery("SELECT * FROM $NOTES_TABLE_NAME WHERE $KEY_NOTE_REMINDER_ID != -1", null)
if (cursor.moveToFirst())
do {
val note = UserNotes()
note.noteTitle = cursor.getString(cursor.getColumnIndex(KEY_NOTE_TITLE))
note.noteText = cursor.getString(cursor.getColumnIndex(KEY_NOTE_TEXT))
note.noteReminderID = cursor.getInt(cursor.getColumnIndex(KEY_NOTE_REMINDER_ID))
notes.add(note)
} while (cursor.moveToNext())
if (!cursor.isClosed) cursor.close()
return notes
}
Данные из 2-го SQLite
fun readPendingAlarms(): ArrayList<HashMap<String, Int>> {
val db: SQLiteDatabase? = readableDatabase
val hashArrayList: ArrayList<HashMap<String, Int>> = ArrayList()
val cursor: Cursor = db!!.rawQuery("SELECT * FROM $ALARM_TABLE_NAME", null)
if (cursor.moveToFirst())
{
do {
val alarmHashMap = HashMap<String, Int>()
alarmHashMap["year"] = cursor.getInt(cursor.getColumnIndex(KEY_ALARM_YEAR))
alarmHashMap["month"] = cursor.getInt(cursor.getColumnIndex(KEY_ALARM_MONTH))
alarmHashMap["day"] = cursor.getInt(cursor.getColumnIndex(KEY_ALARM_DAY))
alarmHashMap["hour"] = cursor.getInt(cursor.getColumnIndex(KEY_ALARM_HOUR))
alarmHashMap["minute"] = cursor.getInt(cursor.getColumnIndex(KEY_ALARM_MINUTE))
alarmHashMap["second"] = cursor.getInt(cursor.getColumnIndex(KEY_ALARM_SECOND))
alarmHashMap["requestCode"] = cursor.getInt(cursor.getColumnIndex(KEY_ALARM_REQ_CODE))
hashArrayList.add(alarmHashMap)
}while (cursor.moveToLast())
}
if(!cursor.isClosed)
cursor.close()
return hashArrayList
}
LogCat
Добавлен logcat в pastebin, потому что он неправильно форматировал.
Это право решения проблемы? Я беру слишком много ресурсов? Я искал проблему, но большинство ответов говорят, что используют largeHeapSize, что я считаю плохой практикой, если это действительно не нужно. Как мне исправить эту проблему?