我怎么能自己叫垃圾收集器?

时间:2019-07-11 17:26:27

标签: android kotlin garbage-collection

我的活动正在运行一个算法,一旦创建活动,该算法可能会占用大量的设备内存,但工作正常,但是当我继续退出并按回去,然后再次轻按以进入活动时,会不停地进行很多操作有时,似乎该应用程序正在累积内存,我在个人资料上看到这并迫使该应用程序在不到20次尝试后就崩溃了。
但是,注释此代码后,无论执行多少次,我都可以尽快退出并再次退出活动。

编辑:我只是擦除了for循环并对其进行了测试,并且效果很好,看来我多次分裂大字符串以创建映射的方式是在累积内存,这是一种方法处理这个?

这是我的算法,如果重要的话,它在ViewModel上

 fun getAllChartPoint(id: Int){

                 getTotalPackages(id) { // ROOM CALL returns as integer

                      myCallRepository.getOrder(id){ // room call to get an object 'CALL'
                        val odr = SupportVersionHelper.getAdcRateConfigOrDefault(it.adcOdrX!!,it. adcOdrY!!)

                        myPackgerepository.getAllPackagesWithId(it){ // Another ROOM call, returns a list of objects, that contanis a big string that will be splitted

                            for (index in 0 until it.size) {

                                if (it[index].signal != null) {
                                    val splitedPoint = it[index].signal!!.split(" ")
                                    if (isMemoryLow(context)){
                                        return@getFhirPackagesForMonitoringWithId
                                    }
                                    splitedPoint.map { signal ->
                                        signal.toFloatOrNull()?.let { floatSignal ->
                                            map[currIndexMap.toFloat()] = floatSignal
                                            currIndexMap++
                                        }

                                    }
                                }

                            }

                        }

                      }



                 }

            } 

所有Room调用都将添加到CompositeSubscription()中,该对象将通过ViewModel的onCleared()方法清除

fun getNumberPackages(monitoringId: Long, onCompletion: (Int) -> Unit, onFail: (Throwable) -> Unit){
        val subscription = Single.fromCallable { fhirPackageDao?.numberOfFhirPackageForMonitoring(monitoringId) }
                ?.subscribeOn(Schedulers.io())
                ?.subscribe({
                    onCompletion(it ?: return@subscribe)
                }, {
                    onFail(it)
                    BleLogHelper.writeError("Error fetching totak of packages", it)
                })
        subscriptions.add(subscription)

    }

清除viewModel后,有什么办法可以销毁所有实例?我试图用anko lib的doAsync代替这段代码,但是根本没有用

1 个答案:

答案 0 :(得分:1)

无法直接调用垃圾回收,但是您可以调用方法System.gc()向垃圾回收器发送通知到垃圾回收器,请注意,这并没有不能保证会进行收集。

无论如何,这被认为是不好的做法,可能无法解决您的问题。

您的问题很可能是以下问题之一:

  1. 您遇到了一些内存泄漏,这会阻止GC进程,大多数情况下,这是由于在销毁活动后保留对上下文/视图的引用而导致的,从而又阻止了GC处理,您也可以尝试{{3 }}。
  2. 您正在彼此之间开始许多活动,关于这个主题的答案已经很不错了,您可以在这里阅读-LeakCanary