在Android上创建10000个对象时崩溃



我是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,watchinmainsignalcatcherloop,螺纹*= 0x9e560e00,peer = 0x12cf79d0,"信号捕捉器"]:对信号做出反应3 A/LIBC:致命信号11(Sigsegv),代码1,故障ADDR 0x65726E59 TID 26292(alytics.android) I/ART:写下堆栈痕迹到'/data/anr/traces.txt' 申请终止。

我不确定这是否是将许多对象插入领域的最佳实践。

感谢您的帮助!

由于阻止主线程,您正在遇到ANR(应用程序未响应)崩溃。根本原因是这一行:

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

这并不能做您认为的事情。这是初始化Thread,然后用该Thread作为接收器执行代码块。但是,它实际上并未启动Thread - 您的代码是在UI线程上执行的。

相反,您需要向线程提供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
}

最新更新