Это вызывает временную утечку ресурсов, но не постоянную. В конце концов сборщик мусора выпустит всю память и ресурсы. Но вы можете позвонить release()
, чтобы избежать ошибок, потому что «в конечном итоге» может быть недостаточно.
Я проверил на устройстве Android 4.4.2, что когда потоковое AudioTrack
больше не ссылается нигде, и выполняется сбор мусора, он будет завершен, независимо от того, был вызван или нет stop()
.
В исходном коде Android, (я посмотрел на Android N в), finalize()
calls the same native function, как release()
делает:
static void android_media_AudioTrack_finalize(JNIEnv *env, jobject thiz) {
//ALOGV("android_media_AudioTrack_finalize jobject: %x\n", (int)thiz);
android_media_AudioTrack_release(env, thiz);
}
Так что да, в конце концов, ресурсы будут освобождены без необходимости вызывать release()
явно.
Но это может быть проблемой, если слишком много AudioTrack
s создаются за короткий период времени. Создание и разыменования их в цикле:
for (...) {
new AudioTrack(...);
}
В конце концов я получаю эту ошибку в моих журналах:
E/AudioTrack-JNI: Error initializing AudioTrack
E/android.media.AudioTrack: Error code -20 when initializing AudioTrack.
E/AudioTrack: AudioFlinger could not create track, status: -12
сбор мусора не исправить; он не был запущен, потому что было достаточно обычной памяти кучи. Другие ресурсы, типа выпуска release()
, закончились. Эта ошибка не вызывала непосредственную сборку мусора. Вызов release()
, конечно, устраняет эту проблему.