[Android] SharedPreferences ANR 발생
“main” tid=1 Waiting
“pool-4-thread-1” tid=13 Native 디스크 I/O 실행 중
“Answers Events Handler1” tid=15 Native 디스크 I/O 실행 중
“Heap thread pool worker thread 2” tid=2 Native
“Heap thread pool worker thread 0” tid=3 Native
“Heap thread pool worker thread 1” tid=4 Native
“FinalizerWatchdogDaemon” tid=6 Waiting
“HeapTrimmerDaemon” tid=7 Waiting
“ReferenceQueueDaemon” tid=8 Waiting
“FinalizerDaemon” tid=9 Waiting
“GCDaemon” tid=10 Waiting
“Binder_1” tid=11 Native
“Binder_2” tid=12 Native
“Queue” tid=18 Waiting
“Queue” tid=19 Waiting
“Queue” tid=20 Waiting
“Queue” tid=22 Waiting
“Queue” tid=23 Waiting
“Signal Catcher” tid=5 Runnable
SharedPreferences 디스크IO가 발생하는것 보면 역시 파일에 쓰는 것이나 다름없는 듯하다.
SharedPreferences sp = getSharedPreferences("TESTPREF", Activity.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.putBoolean(FA_MODE,true);
editor.commit();
commit()은 동기방식이다. 리턴값으로 boolean 값을 리턴한다.
apply()는 비동기 방식으로 return 값이 없으므로(void()) commit() 보다 빠르다.
저장공간에 지속적인 동기를 유지하며 preferences를 작성하는 commit()과는 다르게 apply()는 메모리 내의 SharedPreferences를 즉시 변경하지만 디스크로의 반영은 비동기적으로 시작되며 작업 실패에 대한 어떠한 알림도 받을 수 없다.
구글링해보니 apply()를 사용할 경우 ANR 문제가 발생하기 더 쉽다고 한다.
어떻게 해야한단 말인가?
commit() 사용하되 스레드를 사용하거나 AsyncTask를 사용해야한다는 것인가…