FragmentでMapViewを表示していたところonDestroyのタイミングでANRが発生しフリーズしてしまう問題でハマりました。
/data/anr/traces.txt
には以下のログが記録されていました。
"main" prio=5 tid=1 Native
| group="main" sCount=1 dsCount=0 obj=0x75de1f90 self=0x7f8ca96a00
| sysTid=16689 nice=-10 cgrp=default sched=0/0 handle=0x7f90e67aa0
| state=S schedstat=( 9184704295 1676607665 12039 ) utm=773 stm=144 core=6 HZ=100
| stack=0x7ffb204000-0x7ffb206000 stackSize=8MB
| held mutexes=
kernel: __switch_to+0x88/0x94
kernel: futex_wait_queue_me+0xd8/0x144
kernel: futex_wait+0xec/0x200
kernel: do_futex+0xdc/0x494
kernel: SyS_futex+0x110/0x19c
kernel: el0_svc_naked+0x24/0x28
native: #00 pc 000000000001c22c /system/lib64/libc.so (syscall+28)
native: #01 pc 00000000000765a0 /system/lib64/libc.so (pthread_cond_wait+96)
native: #02 pc 00000000004ad0e8 /data/app/jp.co.runners.runand.dev-2/lib/arm64/libmapbox-gl.so (???)
native: #03 pc 00000000004ad9f8 /data/app/jp.co.runners.runand.dev-2/lib/arm64/libmapbox-gl.so (???)
native: #04 pc 00000000000a11ec /data/app/jp.co.runners.runand.dev-2/lib/arm64/libmapbox-gl.so (???)
native: #05 pc 00000000002228a0 /data/app/jp.co.runners.runand.dev-2/lib/arm64/libmapbox-gl.so (???)
native: #06 pc 0000000000222a04 /data/app/jp.co.runners.runand.dev-2/lib/arm64/libmapbox-gl.so (???)
native: #07 pc 000000000008400c /data/app/jp.co.runners.runand.dev-2/lib/arm64/libmapbox-gl.so (???)
native: #08 pc 00000000000840b8 /data/app/jp.co.runners.runand.dev-2/lib/arm64/libmapbox-gl.so (???)
native: #09 pc 000000000008d9f0 /data/app/jp.co.runners.runand.dev-2/lib/arm64/libmapbox-gl.so (???)
native: #10 pc 000000000008da64 /data/app/jp.co.runners.runand.dev-2/lib/arm64/libmapbox-gl.so (???)
native: #11 pc 0000000000150210 /data/app/jp.co.runners.runand.dev-2/oat/arm64/base.odex (Java_com_mapbox_mapboxsdk_maps_NativeMapView_nativeDestroy__+124)
at com.mapbox.mapboxsdk.maps.NativeMapView.nativeDestroy(Native method)
at com.mapbox.mapboxsdk.maps.NativeMapView.destroy(NativeMapView.java:124)
at com.mapbox.mapboxsdk.maps.MapView.onDestroy(MapView.java:422)
解決方法
MapView#onDestroy
をFragment#onDestoryView
の中で呼ぶ。
誤ってFragment#onDestroy
の中で呼び出していたのが、原因で今回の問題が発生したようです。
名前が同じだったので間違いやすいと思います。