조사

PointlessBooleanExpression 바이트코드

b1ee3a06f14c1ff5dfb88d4a873d87d9.png to 바이트코드 8fe3e57fd5b85535eb970dcb07576f2b.png

if문 부터 print 까지 동일한 구조로 컴파일되어

컴파일러가 미리 최적화를 해줌을 알수있었습니다

arraylist for loop

viewrootimpl . setwindowstopped 의 경우

7e29059e4567aa6692fb75c4f29103ec.png mwindowstoppedcallbacks.size()를 매번 호출

44b57228ed06f7d57ffe16bef198f94d.png mWindowstoppedcallbacks 는 WindowStoppedcallback의 arraylist

windowstoppedcallback은 인터페이스로 바로위에 정의됨

f0b369a66674be97f7b032283f046451.png windowstoppedcallback은 surfaceview의 interface이며

(=surface가 callback의구현)

c9ab1d441285b284a52fce71e6244e81.png interface의 함수 windowstopped를 override 구현

updatesurface호출시 surfaceview 객체의 msurface를 release

ㅡㅡ호출

722ea84bc20b8713407752747894f7a7.png activity의 perforstop 메소드에서

windowmanagerglobal.setstoppedstate 호출시.

73352aefb30dd79720b5df53a079e4a2.png

에서 root.setwinodwstooped를호출

작동==activity가 stop되었을떄,

activity에 해당하는

window(=viewrootimpl)객체의 view를 render하는

메인renderer thread를 stop한후

메인과 따로도는 surfaceview 의 renderer를

window가 가진 surface갯수 (mwindowstoppedcallbacks.size())

만큼 돌면서 전부 종료

결론== arraylist의 synchronize를위한 코드로보입니다

일단 호출한 메소드에서 synchronize(mlock)을 걸고, 다른 호출진입지점이 없어보이므로

size를 매번구하지 않아도 될거같지만 activity작성 하기에따라 예외가 발생할수도있어보입니다.

그리고 window는 빠르게 화면을 업데이트해야 하는경우 아니면

surfaceview를 사용하지않고 하더라도 많아야 2개를 사용하는점으로보아

최적화를 한다해도 그 영향이 크지않을것으로 보입니다.

다른 size() 함수들도 거의다 arraylist의 concurrency 때문에

이렇게 작성된듯 보입니다.