Android (12)


HTTP post 결과값 받아오기

안드로이드에서 어느샌가 메인스레드에서의 네트워크 작업이 불가능해졌습니다.
물론 필요하다고 생각한 내용이었지만, 애초에 불가능하게 만들 줄은 몰랐습니다.

아무튼, HTTP post 메서드를 스레드로 작업하여, 그 결과값을 받아오는 함수입니다.

http://pastebin.com/RwxMDTYW
기본적으로 Callable을 사용하여 Future에서 작업한 결과를 받아서 return합니다.
도중 Exception이 발생하면 무조건 null을 반환합니다.




HTML unescape in Android

안드로이드에서 서버와 JSON 형식의 데이터를 주고받다 보면, 자연스럽게 접하게 되는 문제가 있다.
바로 HTML escape/unescape 관련 문제이다.

HTML escape는 간단히 말하면 ‘&’, ‘<‘ 같은 특수문자들을 ‘&amp;’, ‘&lt;’ 등과 같이 치환하여 혹시 발생할지 모르는 문제들을 방지하는 것이다.

현재 진행중인 프로젝트에서 서버와 통신을 할때, 받아오는 문자열이 모두 HTML escape 되어 있다.
따라서 사용자들에게 문자열을 보여주기 전에 이를 다시 unescape 하는 과정이 필요하다.

사실 안드로이드에서 HTML unescape 하는 방법은 간단하다.

이렇게만 해줘도 완벽하게 HTML unescape가 완료된다.

그러나, 내가 만들고 있는 안드로이드 프로젝트에서는 매우 많은 양의 문자열을 수시로 unescape해야만 했는데, 위의 코드는 생각보다 느리게 동작했다.
따라서 이를 효과적으로 수행할 방법을 찾아야만 했다.

그렇게 구글링을 하던 도중 발견한 내용에 따르면, org.apache.commons.lang.StringEscapeUtils.unescapehtml메소드를 사용하는 것이 좀 더 빠르다고 한다.
(http://stackoverflow.com/questions/4321896/is-there-a-faster-way-to-decode-html-characters-to-a-string-than-html-fromhtml)

그런데 아래 댓글을 보니 이런 말이 있다.

There’s a chance that unescapeHtml4() from Commons Lang 3.1 is significantly (200x) slower than unescapeHtml() from Commons Lang 2.6. I tested using DDMS and Traceview on Galaxy S3 with Android 4.1.1, and emulator with Android 2.2. I know that Dalvik Just-In-Time is disabled when tracing, so my findings may be inaccurate. But it was enough to scare me into using Commons Lang 2.6 instead of 3.1. – TalkLittle Jan 10 at 22:55

즉, 최신 라이브러리인 3.1 버전 보다 2.6 버전이 빠르다는 말씀…
따라서 2.6 버전 라이브러리를 받아서 사용했다.

결국 최종적으로 사용한 방법은 다음과 같다.

일단 DDMS를 통해 본 결과는 빨라지긴 했지만… 사실 체감될 만큼의 효과는 없없다.
그래도 일단, 이 방법이 가장 최선이라 판단하여 현재 사용하고 있다.