Недостаточно памяти при восстановлении сигналов тревоги в 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, что я считаю плохой практикой, если это действительно не нужно. Как мне исправить эту проблему?

0 ответов

Другие вопросы по тегам