본문 바로가기
Development/Android

[안드로이드] WeekReference 에 대해서

by 푸민 2015. 10. 25.
반응형


안녕하세요 푸민입니다.


안드로이드 개발을 하면서 가장 중요한것 3가지를 꼽으라고 한다면...


1. 네트워킹!

- 요즘 모든 앱이 네트워크 없이는 동작을 안하기에 네트워크 관리는 가장 기본이면서 가장 중요한것 같습니다.


2. UI 요소

- 모바일이라는 작은 환경에서 정말 필요한 기능 및 UI 에 대해서 잘 구성해야 되고 또 디자인이 트랜드에 맞게 잘 갖추어져야합니다.


3. 메모리 관리

- 자바의 특성상 가비지컬렉터(GC)가 계속해서 메모리 관리를 하지만, 역시 기계가 관리하는데에는 한계가 있습니다. 메모리를 생각하고 프로그래밍하는 것과 그냥 하는 것은 굉장한 차이가 있습니다. 특히나 이미지 관리에서 많이 나타나는데요. 이미지 파일 자체가 굉장히 많은 메모리를 차지하기 때문지이요.


그래서! 오늘 알아볼 것은 WeekReference 입니다. 이 객체는 메모리 관리에 굉장히 많은 도움을 줍니다. 용어 그대로 표현하면 약한 변수인데요, 이게 뭐냐면 약한 결합을 가진 변수가 됩니다. 연결 고리가 적으면 약해지고 연결이 되어 있으면 강한 결합이 되는 것입니다. 변수의 결합니 약해졌을 경우 GC의 대상이 되어 메모리를 재 사용할 수 있게 됩니다. 자자 예제로 한번 보실까요?


class BitmapWorkerTask extends AsyncTask {
    private final WeakReference imageViewReference;
    private int data = 0;

    public BitmapWorkerTask(ImageView imageView) {
        // Use a WeakReference to ensure the ImageView can be garbage collected
        imageViewReference = new WeakReference(imageView);
    }

    // Decode image in background.
    @Override
    protected Bitmap doInBackground(Integer... params) {
        data = params[0];
        return decodeSampledBitmapFromResource(getResources(), data, 100, 100));
    }

    // Once complete, see if ImageView is still around and set bitmap.
    @Override
    protected void onPostExecute(Bitmap bitmap) {
        if (imageViewReference != null && bitmap != null) {
            final ImageView imageView = imageViewReference.get();
            if (imageView != null) {
                imageView.setImageBitmap(bitmap);
            }
        }
    }
}

위의 AsyncTask 를 보면 Bitmap을 가져오는 작업을 합니다. 먼저 생성할 때 이미지뷰를 넘겨 받아서 해당 이미지 뷰를 직접 변수로 저장하지 않고 WeekReference 에 의한 참조 객체를 만듭니다. 그리고 doingBackground() 작업을 완료 후에 WeekReference 객체를 통해서 ImageView 를 가져와서 Bitmap 을 설정합니다.


이미지 하나를 적용하는데 매우 불편해 보이지만, 아주 큰 이미지를 불러올 경우 MainThread 를 사용하면 버벅거리며 멈추는 현상이 발생할 수 있습니다. 그래서 먼저 Async 를 사용하는 것이고, 이 코드에서 WeekReference 의 역활은, 해당 이미지를 불어오는 도중에 뭔가 다른 액션이 발생하여서, 예를 들면 액티비티를 종료하는 등이 발생하면 해당 이미지뷰에 대한 연결이 약해집니다. 그러면 WeekReference 에서 해당 이미지뷰를 CG 의 대상으로 적용하고 Bitmap 로딩 후 작업은 ImageView 가 null 이라서 작업을 안하게 됩니다. 그래서 하나 유의해야 할 사항은 WeekReference 를 사용할 때는 항상 null 체크를 해야합니다.

반응형

댓글