개발자 블로그

안드로이드 ProgressDialog Deprecated 관련 삽질 기록 본문

프로그래밍/안드로이드

안드로이드 ProgressDialog Deprecated 관련 삽질 기록

로이드.Roid 2017. 9. 27. 18:05

안드로이드 오레오(8.0, API26)에서 ProgressDialogDeprecated 되었다. iOS에는 원래 이게 없어서 만들어 썼었는데.. 안드로이드에서는 있던 걸 Deprecate 시켰다. 

아니 왜?? 이유를 찾아보니..

ProgressDialog가 모달(Modal) 대화상자기 대문에 사용자와의 상호작용성을 떨어트리기 때문이란다. 아예 ProgressBar를 화면에 추가하던지, Notification을 통해서 구현하라고 한다. 

아래는 그 내용. (출처)

This class was deprecated in API level 26.
ProgressDialog is a modal dialog, which prevents the user from interacting with the app. Instead of using this class, you should use a progress indicator like ProgressBar, which can be embedded in your app's UI. Alternatively, you can use a notification to inform the user of the task's progress.


사실 Deprecated 되었다고 해서 바로 못쓰는거는 아니기 때문에 그냥 써도 당장 문제가 생기는건 아니다. Android Studio에 표시되는 노란색 경고와 취소선이 보기 싫을 뿐.. (아래 사진처럼..)


ProgressDialog를 만드는게 그닥 어려운게 없기 때문에 그냥 직접 만들었다. 그리고 업데이트 한 앱을 릴리즈 했다가 아래와 같은 경고 메일을 받았다.

비정상종료 없이 사용하는 사용자 수치가 100%에서 94.7%로 떨어졌다고 Crashlytics에서 알려주는거다. 갑자기 앱 크래시가 증가한 이유는 두 가지가 있었다.



1. 안드로이드 마시멜로 버전의 버그

이런 문제가 있었는지 처음 알았다. ProgressDialog를 사용했을 때는 발생하지 않던 문제였으니깐. 내가 커스텀으로 만든 프로그레스 대화상자는 DialogFragment를 상속받아서 만들었는데, show 함수를 호출 할 때 IllegalStateException이 발생했다.

정확한 발생 조건은

1. 안드로이드 마시멜로
2. onRequestPermissionResult 콜백 함수에서 
3. DialogFragmentshow 함수 호출

이렇다. 마시멜로의 버그라고 한다. 

해결방법은 Flag 변수를 하나 선언해서 onRequestPermissionResult()에서는 해당 플래그 변수만 set 한 다음에 onResume()에서 플래그 변수의 상태를 보고, 적절히 DialogFragment.show()를 호출하면 된다.

아님 그냥 Deprecated 된 ProgressDialog를 사용하는 방법도 있.....-_-;;

이 문제와 관련된 자세한 내용은 여기를 참고하자.



2. 백그라운드로 전환 된 상태에서의 dismiss 호출

이 문제는 사실 예전에 이미 한 번 겪었던 문제였는데.. 깜빡 있고 있었다. 백그라운드 상태에서 dismiss를 호출하면 IllegalStateException이 발생한다. 

해결은 간단하다. dismiss 대신에 dismissAllowingStateLoss를 사용하면 된다.



그리고 이번에 처음 알게 된건데.. ProgressBar의 증가 애니메이션 효과는 '누가(API 24)' 부터 사용한 기능이었다..-_-;; 누가 미만에서 애니메이션 효과를 사용하려면, ObjectAnimator를 사용해서 처리해야 된다. 

ObjectAnimator를 사용할 때 한가지 주의할 점은 step을 1씩 증가시키면 애니메이션 처리가 안된다. 이게 글로 설명하려니깐 조금 어렵긴한데.. 0에서 1로 늘리는건(step이 1) 애니메이션이 없는 것과 똑같다. 대신에 0에서 30으로 늘릴 때(step이 30)는 애니메이션 효과가 생긴다. 

그래서 애니메이션 효과를 꼭 주고 싶다면 내부적으로 처리를 좀 해줘야 된다. 내 경우에는 step은 기존 코드 그대로 1씩 증가시키고, 대신에 프로그레스 대화상자에 multiplier 변수를 선언했다. 값은 30으로 주고, progress를 증가 시킬 때 step에 multiplier 값을 곱해서 사용했다. max에도 당연히 multiplier를 곱해줘야 되고.. getProgress도 처리해줘야 된다. 

지금 글을 쓰다보니깐 그놈의 애니메이션이 뭐라고 이렇게까지 했나.. 싶네..-_-;;


암튼, 여기 까지 ProgressDialog Deprecated 관련 삽질 기록 끝!

Comments