만족

[Android] boommenu 라이브러리 오류 (java.lang.IndexOutOfBoundsException) 본문

[Android] boommenu 라이브러리 오류 (java.lang.IndexOutOfBoundsException)

FrontEnd/Android Satisfaction 2020. 7. 31. 03:48

 

https://github.com/Nightonke/BoomMenu

 

Nightonke/BoomMenu

A menu which can ... BOOM! - Android. Contribute to Nightonke/BoomMenu development by creating an account on GitHub.

github.com

 

프로젝트에서 이 라이브러리를 사용하던 도중, 오류 리포트에 다음과 같은 예외가 엄청나게 발생하기 시작했다

 

Fatal Exception: java.lang.IndexOutOfBoundsException
Index: 0, Size: 0
java.util.ArrayList.get (ArrayList.java:437)
com.nightonke.boommenu.BoomMenuButton.createPieces (BoomMenuButton.java:419)
com.nightonke.boommenu.BoomMenuButton.doLayoutJobs (BoomMenuButton.java:401)
com.nightonke.boommenu.BoomMenuButton.access$1600 (BoomMenuButton.java:66)
com.nightonke.boommenu.BoomMenuButton$7.run (BoomMenuButton.java:1016)
android.os.Handler.handleCallback (Handler.java:883)

 

무수한 Exception의 요청이...

그런데 내 기기에서는 무슨짓을 해도 이 버그가 발생하지 않아서 어리둥절하고 있던 참에...

 

어차피 라이브러리 규모가 큰 것도 아니니 뜯어서 알아봤다.

 

createPieces() 부분에서 에러가 나는 걸로 보여서 해당 메소드를 사용하는 함수를 뒤져보니

onLayout이 아직 BoomMenu가 준비되지 않은 상태에서 호출되어 OutOfIndex가 발생한 것이다.

View Lifecycle
Activity Lifecycle

View의 onLayout이 발생하기 전에 boomMenu에 builder를 지정해주지 않으면,

boomMenu내부의 pieces는 아무것도 담겨있지 않은 상태가 되고,

이 상태에서 onLayout 페이즈로 들어오면 xml에서 지정한 piece갯수만큼 for를 돌려 create하기 때문에 위와 같은 에러가 발생한다.

 

View의 onLayout은 Activity의 onResume이후에 호출된다.

 

따라서 Activity의 onCreate~onResume 페이즈에서 반드시 boomMenu를 초기화해야만(addBuilder, addBuilders) 정상적으로 작동한다.

(나의 경우에는 특정 상황이 발생하면 초기화하지 않게 해 두었는데 그래서 발생한 문제였다)

 

이렇게 무대포로 앱을 터뜨려버리는 라이브러리는 처음이다.

보통은 초기화 안하면 해당 컴포넌트를 삭제하거나 숨기는 방식으로 가지 않나..?

 

난생 처음으로 Issue에 댓글도 달아봤는데

 

이 형님은 빡쳐서 다른 라이브러리 찾으러 간 것 같다....



Comments