IT_Programming/Android_Java

WebView CookieManager removeSessionCookie()

JJun ™ 2011. 11. 27. 07:23

------------------------------------------------------------------------------------------------

 출처: http://java.ihoney.pe.kr/195

------------------------------------------------------------------------------------------------

 

 

프로젝트에서 하이브리드앱 형태로 해서 모바일 웹페이지를 안드로이드의 웹뷰에서

보여주며 동작시키는 앱을 만들었다.

 

제조사마다 다양한 종류의 디바이스에서 테스트를 해봐야하는 안드로이드 개발은

앞으로도 고역이 될 것 같다.


얼마간 나를 괴롭히던 녀석이 있었다.

로그인을 할때 CookieManager를 이용해서 웹뷰의 쿠키 Sync를 맞춰두고

로그인 상태를 유지하도록 만들었다.

이 싱크를 맞추는 작업이 지금까지도 곤혹스럽다.


갤럭시S는 사용자가 많다.

그런데 가장 이상한 안드로이드폰이 갤럭시 S다.

갤럭시S를 제외한 안드로이드폰들에서는 정상적으로 동작하는 앱이 꼭!

갤럭시S에서는 다르게 반응하는 것이다. 후아.

 

인터넷을 뒤져보다가 이 문제에 대한 해결책을 찾았다.


 

 

 

 

/** * 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<arraylist<cookie>> cookieList = mCookieMap.values();                
                          Iterator<arraylist<cookie>> listIter = cookieList.iterator();                
                          while (listIter.hasNext())
                          {                   
                                  ArrayList<cookie> list = listIter.next();                    
                                  Iterator<cookie> 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년 전에 작성된 글인데, 글의 중간에 보면

cookieManager.removeSessionCookie();
// 500ms 강제 delay 주고 하단 부분 실행!!
try { Thread.sleep(500); } catch (Exception e) {}
for (int i = 0; i < cookies.size(); i++) {
...
...
}


위의 코드가 핵심이다. 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!");     
     }   
} 

 

 

 

처럼 처리했다.