Сбой при создании 10000 объектов в Realm на Android - PullRequest
0 голосов
/ 12 марта 2019

Я довольно новичок в Android и Kotlin.

У меня есть приложение, которое выполняет некоторые вычисления. Я пытаюсь сделать тестирование производительности. Для этого я хочу создать 10000 объектов:

    Thread().run() {

        try {
            val realm = Realm.getDefaultInstance()

            // Test endedSessions
            val sessions = realm.where<Session>().findAll()
            if (sessions.size < 10) {

                val numberOfSessions = 10000

                realm.beginTransaction()

                for (index in 0..numberOfSessions) {

                    if (index % 1000 == 999) { // added to test and understand when it's crashing
                        Timber.d("****** committing at ${index} sessions...")
                        realm.commitTransaction()
                        realm.beginTransaction()
                    }

                    val session = Session.newInstance(realm, false)

                    // Set Data
                    val calendar = Calendar.getInstance()
                    calendar.set(
                        (2017..2018).random(),
                        (0..11).random(),
                        (0..28).random(),
                        (0..23).random(),
                        (0..59).random()
                    )

                    val startDate = calendar.time
                    calendar.add(Calendar.HOUR_OF_DAY, (2..12).random())
                    calendar.add(Calendar.MINUTE, (0..59).random())
                    val endDate = calendar.time

                    session.startDate = startDate
                    session.endDate = endDate

                    session.result?.let { result ->
                        result.buyin = buyinList.random()
                        result.netResult = resultsList.random()
                    }

                }

                realm.commitTransaction()

            }

            realm.close()
        } catch (e: Exception) {
            Timber.e(e)
        }

    }

Проблема в том, что после 5000 сеансов на эмуляторе я получаю следующую ошибку:

I / art: Thread [3, tid = 26297, WaitingInMainSignalCatcherLoop, Thread * = 0x9e560e00, peer = 0x12cf79d0, "Signal Catcher"]: реагирование на сигнал 3 A / libc: фатальный сигнал 11 (SIGSEGV), код 1, адрес ошибки 0x65726e59 в тид 26292 (alytics.android) I / art: написал трассировки стека в '/data/anr/traces.txt' Приложение прекращено.

Я не уверен, что это лучшая практика для вставки большого количества объектов в Царство.

Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 12 марта 2019

Вы столкнулись с аварией ANR (приложение не отвечает) из-за блокировки основного потока. Основной причиной является эта строка:

Thread().run() {
  // do work
}

Это не делает то, что вы думаете, что делает. Это инициализирует Thread, а затем выполняет блок кода с этим Thread в качестве получателя. Однако на самом деле он не запускает Thread - вместо этого ваш код выполняется в потоке пользовательского интерфейса.

Вместо этого вам нужно предоставить Runnable вашей ветке и .start it:

Thread {
  // do your work in here
}.start() // this kicks off the thread and runs the block above asynchronously.

Альтернатива, просто создайте исполнителя и отправьте свою работу:

Executors.newSingleThreadExecutor().submit { 
  // do your work in here
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...