프로젝트에서 하이브리드앱 형태로 해서 모바일웹페이지를 안드로이드의 웹뷰에서 보여주며 동작시키는 앱을 만들었다.
제조사마다 다양한 종류의 디바이스에서 테스트를 해봐야하는 안드로이드 개발은 앞으로도 고역이 될 것 같다.
얼마간 나를 괴롭히던 녀석이 있었다.
로그인을 할때 CookieManager를 이용해서 웹뷰의 쿠키 Sync를 맞춰두고 로그인상태를 유지하도록 만들었다.
이 싱크를 맞추는 작업이 지금까지도 곤혹스럽다.
갤럭시S는 사용자가 많다. 그런데 가장 이상한 안드로이드폰이 갤럭시S다. 갤럭시S를 제외한 안드로이드폰들에서는
정상적으로 동작하는 앱이 꼭! 갤럭시S에서는 다르게 반응하는 것이다. 후아.
인터넷을 뒤져보다가 이 문제에 대한 해결책을 찾았다.
참고 Url : http://cdkkcdkktoandroid.tistory.com/27
CookieManager 소스 url :
/** * Remove all session cookies, which are cookies without expiration date */ public void removeSessionCookie() { final Runnable clearCache = new Runnable() { public void run() { synchronized(CookieManager.this) { Collection> cookieList = mCookieMap.values(); Iterator > listIter = cookieList.iterator(); while (listIter.hasNext()) { ArrayList list = listIter.next(); Iterator iter = list.iterator(); while (iter.hasNext()) { Cookie cookie = iter.next(); if (cookie.expires == -1) { iter.remove(); } } } CookieSyncManager.getInstance().clearSessionCookies(); } } }; new Thread(clearCache).start(); }
위의 소스를 보면 마지막에 new Thread(clearCache).start()가 실행되는 것이 보인다. CookieManager.removeSessionCookie() 가 스레드로 실행되는 것을 확인할 수 있다.
갤럭시S가 다른폰들과 다른 반응을 보인 부분이 이 부분이다.
인터넷에 해결방법이 있을까?
하는 생각으로 인터넷을 뒤적거리다가 해결방법을 찾았다.
jinu's blog : Android webview cookie sync 문제 : http://jinu.info/blog/372
1년 전에 작성된 글인데, 글의 중간에 보면
try
{ Thread.sleep(
500
); }
catch
(Exception e) {}
위의 코드가 핵심이다. 500ms의 강제 대기시간을 주어서 cookieManager가 세션쿠키를 삭제할 수 있는 충분한 시간적인 여유를 부여한 후에 진행되도록 하는 것이다.
<< 위의 내용을 힌트삼아서 수정한 소스 >>
public void removeAllCookie() { Log.d(LOG_TAG, "webViewHelper removeAllCookie execute."); cookieManager.removeAllCookie(); threadSleep(); setDefaultCookies(); CookieSyncManager.getInstance().sync(); } public void removeSessionCookies() { Log.d(LOG_TAG, "webViewHelper removeSessionCookies execute."); cookieManager.removeSessionCookie(); threadSleep(); this.httpClient = null; setDefaultCookies(); CookieSyncManager.getInstance().sync(); } private void threadSleep() { try { Thread.sleep(500); } catch (Exception e) { Log.d(LOG_TAG, "thread Exception!"); } }
처럼 처리했다.
'Android' 카테고리의 다른 글
안드로이드 비인증 앱 업데이트하면 요래요래 (0) | 2012.03.11 |
---|---|
안드로이드에서 위치정보를 가져오지 못하는 경우, LocationManager.getKnownLastLocation 에서 null이 발생할 경우 (2) | 2011.11.02 |
SVN으로 소스받은 안드로이드 프로젝트 인식시키기 (0) | 2011.09.26 |
01-1. Android SDK 설치하기(WIndows) (0) | 2009.11.29 |
04. Application manifest (0) | 2009.11.10 |