기본 콘텐츠로 건너뛰기

Android Bitmap 이미지 처리 Tip

이미지 처리라기 보단.. 
그 이미지를 썻을 때 Heap Memory 반환이 될 수 있도록 처리해주는 팁이다. 

아래 내용으로 Activity 에서 찍어보면 

Log.i("★", "memory size : " + ((ActivityManager)this.getSystemService(Context.ACTIVITY_SERVICE)).getMemoryClass());
Log.i("★", "dalvik heap 최대크기 : " + Runtime.getRuntime().maxMemory());
Log.i("★", "dalvik heap 영역크기 : " + Runtime.getRuntime().totalMemory());
Log.i("★", "dalvik heap 여유 공간 : " + Runtime.getRuntime().freeMemory());
Log.i("★", "dalvik heap 할당된 크기 : " + (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()));
Log.i("★", "getNativeHeapSize : " + Debug.getNativeHeapSize());
Log.i("★", "getNativeHeapFreeSize : " + Debug.getNativeHeapFreeSize());
Log.i("★", "getNativeHeapAllocatedSize : " + Debug.getNativeHeapAllocatedSize());

아래와 같이 출력된다. 흠................ 

05-23 16:11:20.901: I/★(17767): memory size : 64 
05-23 16:11:20.901: I/★(17767): dalvik heap 최대크기 : 67108864
05-23 16:11:20.901: I/★(17767): dalvik heap 영역크기 : 60309504
05-23 16:11:20.901: I/★(17767): dalvik heap 여유 공간 : 13493048
05-23 16:11:20.901: I/★(17767): dalvik heap 할당된 크기 : 46816608
05-23 16:11:20.901: I/★(17767): getNativeHeapSize : 32321536
05-23 16:11:20.906: I/★(17767): getNativeHeapFreeSize : 506104
05-23 16:11:20.906: I/★(17767): getNativeHeapAllocatedSize : 31815432

아래 이미지는 위 내용의 이해를 도울수 있을듯하여 다른 블로그에서 발췌해왔다. 

Android 메모리 모델

Android의 메모리 모델은 운영체제의 버전에 따라 Honeycomb(Android 3.0) 미만의 메모리 모델과 Honeycomb 이상의 메모리 모델, 두 가지로 나뉜다. 먼저 Honeycomb 미만의 메모리 모델을 살펴보자.




요즘 우리쪽 앱이 이 영역을 넘치는 모양인지 outofmemory error 가 나서 확인해보았다. 

위 에러가 나면 앱이 뻗어버리는데, 이유인즉슨 사용가능한 메모리 공간을 넘어섯다는것. 
너무 사용했거나, 사용하고 불필요한것들을 반환해주지 않아서 이런일이 발생한다고 구글에선 말하고있다................... 

아 뭐 말이 쉽지.. ㅋㅋ 


아무튼 이곳저곳 뒤지다가 givenjazz 라는 분께서 유용한 유틸을 만들어주셧길래 사용해보았고, 효과가 나름 ? 있는듯 하여 포스팅해본다. 

사용방법은... 아래 소스를 그대로 긁어서 클래스를 만들고. 

Activity 가 finish() 를 호출하거나 destroy 되는 시점에서 아래 두줄을 호출하여 리소스를 반환해준다는 점. 

RecycleUtils.recursiveRecycle(getWindow().getDecorView());
System.gc();                 << 이녀석은 좀 쌩뚱맞지만.. 가비지컬렉션 이라고해서, 쓰레기들을 청소?해준다는 개념으로다가 함께... 

하지만 난 아직 이걸로도 에러가 완전히 잡히지 않았다는 점!! 아나.. 

============================================================================================================
<소스> 
package xxx.xxx.xxx;

import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ImageView;
/**
 * @author givenjazz
 * Bitmap 이미지 사용범위에 대해 앱 종료시 호출되며 
 * 리소스 반환 역할을 해주어 메모리 관리를 돕느다.  
 * 
 */
public class RecycleUtils {
       
    private RecycleUtils(){};
    public static void recursiveRecycle(View root) {
        if (root == null)
            return;
        root.setBackgroundDrawable(null);
        if (root instanceof ViewGroup) {
            ViewGroup group = (ViewGroup)root;
            int count = group.getChildCount();
            for (int i = 0; i < count; i++) {
                recursiveRecycle(group.getChildAt(i));
            }
            if (!(root instanceof AdapterView)) {
                group.removeAllViews();
            }
        }
       
        if (root instanceof ImageView) {
            ((ImageView)root).setImageDrawable(null);
        }
         root = null;
        return;
    }
}

============================================================================================================

댓글

이 블로그의 인기 게시물

변액보험판매자격시험공부 요점정리

생명보험협회 주관 변액보험판매자격시험 (PBT)  요점 정리 입니다  아래 내용만 3일정도 외워서  모의고사 4번정도 풀고  시험봤구요  82.5점으로 합격했습니다 모두들 합격하세요 ~!  --------------------------------------------------------------------- 직접금융 / 간접금융 은행 : 간접금융 자금의 공급자와 수요자 사이에서 빌려주고,돌려받는것을 수행해준다 공급자와 수요자가 직접 거래하고 책임지지 않는다 증권사 : 직접금융 기업(공급자)은 주식/채권 발행 -> 증권사는 그것들을 인수역할을함 개인(수요자)는 기업이 발행한 주식/채권을 직접 매매한다 자금의 공급자와 수요자가 직접 책임진다 증권사는 중간연결다리 역할만 한다 금융시장의 기능 자금의 중계 금융자산의 가격결정 유동성 제공 거래비용 절감 ★ 탐색비용, 정보비용등이 금융시장이 있음으로 인해 비용이 절감된다 ★ 위험관리 위험 = 변동성, 위험이크다(변동성이크다), 위험에 대한 보상 = 위험프리미엄 위험회피도가 높은 투자자는 변동성이 높은 투자를 했을때 위험회피도가 낮은 투자자에 비해 위험프리미엄이 높다 시장규율 만기는 1년을 기준으로함 1년 미만 :  자금시장  (단기) 장기시장에비해  거래규모 크다 (유동성 풍부) 1년 이상 :  자본시장  (장기)  오래투자하므로 단기보다  변동폭이 크다 단기시장은 유동성이 풍부하고 변동폭이 크다 (X) : 변동폭이 큰건 장기시장이다 장기상품  주식 채권 자산유동화증권 단기상품 장기상품을 제외하고 전부다 단기상품 콜 금융 기관 끼리 돈을 빌리는것 만기 1일이 대다수 최장만기는 90일 RP (환매채권) 개인 의 채권 투자 방식  증권사가 사들인 기업채권을 개인이 투자하고, 증권사가 개인이 투자한 채권을 다시 사들이는 형태 예금자보호 불가  (영어로된 용어는 예금자보호불가)...

Android 스마트폰 기본 웹브라우저(Chrome:크롬) 호출하는 스키마(URL Scheme)

신용카드결제 페이지 주소를 카톡으로 던졌을때 카톡 내부에서 결제가 이루어지다보니 결제완료까지 정상적으로 처리되지 않는 경우가 발생한다더라 그래서 생각해본게.. 1) 카카오통 채팅방  2) 링크 전송  3) 링크를 클릭하면 스마트폰애 내장된 웹브라우저를 실행하는 URL스키마 실행  4) 실행된 웹브라우저에서 결제페이지로 이동 이 절차를 거치면 카톡 외부로 나와서 독립적인 웹브라우저상에서 결제를 진행하기때문에 정상처리가 가능할것이라고 판단 찾다 찾다가.. 알아낸것이 안드로이드 (가능) - 롤리팝부터 크롬 브라우저가 기본앱이다 - 크롬을 호출방법 intent://www.naver.com#Intent;scheme=http;package=com.android.chrome;end  아이폰 (조건부 가능) - 사파리를 호출하는 앱스키마가 없으며, 사파리를 통해서 검색어를 입력한 검색기능만 가능 - 크롬브라우저 앱이 설치되어있을경우 아래와같이 호출 가능 googlechrome:////www.naver.com <사용법> < html > < body > < script >      var currentOS = "else" ;      var mobile = ( /iphone | ipad | ipod | android/ i .test(navigator.userAgent.toLowerCase()));      if (mobile) {          var userAgent = navigator.userAgent.toLowerCase();    ...

SVN 백업 및 이동 (서버에서 다른서버로 SVN을 이동하여 구축할 때 ~ )

처음엔 막연했는데 막상 해보니 겁나 간단했다.    1. 기존 svn 으로 사용되고있는 저장소에서 덤프를 뜬다 ( = 백업을 뜬다) [기존 서버] # svnadmin dump /home/svn/repo-tasks > svn.dump   2. 저 덤프파일을 FTP 로 이동시키거나 서버끼리 마운트된 디렉토리로 공유를 하거나 해서 새로 구축될 svn 디렉토리로 복사한다.    3, 복사후 새롭게 사용될 svn저장소를 생성 (이미 있으면 생략~ ) # svnadmin create /home/svn/new_svn    * 새로 만들어진 svn 으로 덤프를 적용시켜도 설정파일은 변하지 않으므로 설정파일도 기존에 사용하던 svn 설정내용에 맞게 수작업으로 변경해주어야 함   * 설정파일 수정방법은 본 블로그 SVN 설치 라는 게시글에 작성되어 있습니다.    4. 덤프를 신규 svn저장소에 때려박기  [새로 사용될 서버] # svnadmin load /home/svn/new_svn < svn.dump   이동하기 끝!