From e318bbc0577cc0d8e929524b4f701c4eb3c0655e Mon Sep 17 00:00:00 2001 From: Sameer Jiwani <> Date: Mon, 5 Feb 2024 16:42:07 -0500 Subject: [PATCH 1/2] call arcore.destroy off of main thread --- .../java/io/github/sceneview/ar/ARSceneView.kt | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/arsceneview/src/main/java/io/github/sceneview/ar/ARSceneView.kt b/arsceneview/src/main/java/io/github/sceneview/ar/ARSceneView.kt index 8c23f66e..857f24b7 100644 --- a/arsceneview/src/main/java/io/github/sceneview/ar/ARSceneView.kt +++ b/arsceneview/src/main/java/io/github/sceneview/ar/ARSceneView.kt @@ -7,6 +7,7 @@ import androidx.activity.ComponentActivity import androidx.lifecycle.DefaultLifecycleObserver import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleOwner +import androidx.lifecycle.coroutineScope import com.google.android.filament.Engine import com.google.android.filament.IndirectLight import com.google.android.filament.MaterialInstance @@ -44,6 +45,9 @@ import io.github.sceneview.model.Model import io.github.sceneview.model.ModelInstance import io.github.sceneview.node.LightNode import io.github.sceneview.node.Node +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch /** * A SurfaceView that integrates with ARCore and renders a scene @@ -561,7 +565,7 @@ open class ARSceneView @JvmOverloads constructor( override fun destroy() { if (!isDestroyed) { - arCore.destroy() + destroyAr() defaultCameraNode?.destroy() defaultCameraStream?.destroy() @@ -573,6 +577,14 @@ open class ARSceneView @JvmOverloads constructor( super.destroy() } + fun destroyAr() { + val scope = lifecycle?.coroutineScope ?: CoroutineScope(Dispatchers.IO) + scope.launch(Dispatchers.IO) { + // destroy should be called off the main thread since it hangs for many seconds + arCore.destroy() + } + } + class DefaultARCameraNode(engine: Engine) : ARCameraNode(engine) { init { // Set the exposure on the camera, this exposure follows the sunny f/16 rule @@ -596,7 +608,7 @@ open class ARSceneView @JvmOverloads constructor( } override fun onDestroy(owner: LifecycleOwner) { - arCore.destroy() + destroyAr() } } From 7b3e6a6da95050bf946bcec463b1053c5b912a1c Mon Sep 17 00:00:00 2001 From: Sameer Jiwani <> Date: Mon, 5 Feb 2024 17:47:13 -0500 Subject: [PATCH 2/2] rename method as per PR comment --- .../src/main/java/io/github/sceneview/ar/ARSceneView.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/arsceneview/src/main/java/io/github/sceneview/ar/ARSceneView.kt b/arsceneview/src/main/java/io/github/sceneview/ar/ARSceneView.kt index 857f24b7..43683934 100644 --- a/arsceneview/src/main/java/io/github/sceneview/ar/ARSceneView.kt +++ b/arsceneview/src/main/java/io/github/sceneview/ar/ARSceneView.kt @@ -565,7 +565,7 @@ open class ARSceneView @JvmOverloads constructor( override fun destroy() { if (!isDestroyed) { - destroyAr() + destroyARCore() defaultCameraNode?.destroy() defaultCameraStream?.destroy() @@ -577,7 +577,7 @@ open class ARSceneView @JvmOverloads constructor( super.destroy() } - fun destroyAr() { + fun destroyARCore() { val scope = lifecycle?.coroutineScope ?: CoroutineScope(Dispatchers.IO) scope.launch(Dispatchers.IO) { // destroy should be called off the main thread since it hangs for many seconds @@ -608,7 +608,7 @@ open class ARSceneView @JvmOverloads constructor( } override fun onDestroy(owner: LifecycleOwner) { - destroyAr() + destroyARCore() } }