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..43683934 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() + destroyARCore() defaultCameraNode?.destroy() defaultCameraStream?.destroy() @@ -573,6 +577,14 @@ open class ARSceneView @JvmOverloads constructor( super.destroy() } + 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 + 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() + destroyARCore() } }