Android에서 이미지 로딩을 위한 Picasso 활용법

Picasso는 Square에서 개발한 안드로이드 전용 이미지 처리 라이브러리로, 네트워크 또는 로컬 파일에서 이미지를 다운로드하고 캐시하는 기능을 제공한다. 이 라이브러리는 간편한 API 설계와 자동화된 리소스 관리로 인해 이미지 로딩 작업을 크게 단순화한다.

기본 사용법

이미지를 로드하려면 with(), load(), into() 메서드를 조합하여 사용한다.

Picasso.with(context)
    .load("https://example.com/image.jpg")
    .into(imageView);

주요 옵션 및 기능

  • .noFade(): 애니메이션 효과 없이 바로 이미지 표시.
  • .resize(width, height): 이미지 크기를 지정된 크기로 조정.
  • .onlyScaleDown(): 원본보다 큰 이미지만 축소, 무조건 확대 방지.
  • .centerInside(): 전체 이미지가 컨테이너 내에 들어오도록 비율 유지하며 축소.
  • .centerCrop(): 중심 부분을 자르며, 전체 영역을 채우되 비율 유지.
  • .fit(): 이미지 뷰의 실제 크기에 맞춰 최적의 크기로 조정.
  • .priority(Priority.HIGH): 로딩 우선순위 설정 (예: 상단 이미지 우선).
  • .tag("list_item"): 요청에 태그를 붙여 스크롤 중 일시 정지/재개 가능.

태그 기반 제어 예제

리스트뷰 스크롤 시 로딩을 일시 정지하고, 정지 후 재개할 수 있다.

// 스크롤 상태 변경 시
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
    Picasso picasso = Picasso.with(context);
    if (scrollState == SCROLL_STATE_IDLE || scrollState == SCROLL_STATE_TOUCH_SCROLL) {
        picasso.resumeTag("list_item");
    } else {
        picasso.pauseTag("list_item");
    }
}

액티비티 종료 시 모든 요청 취소:

@Override
protected void onDestroy() {
    super.onDestroy();
    Picasso.with(context).cancelTag("list_item");
}

고급 기능

  • .fetch(): 이미지를 백그라운드에서 로드하지만 화면에 표시하지 않음 (캐싱 목적).
  • .get(): 비동기로 Bitmap 반환 (메인 스레드에서 호출 불가).
  • Target: ImageView 대신 콜백으로 결과 받기.

커스텀 변환 처리

이미지에 필터나 형식을 적용하려면 Transformation 인터페이스를 구현한다.

private class BlurTransformation implements Transformation {
    private final RenderScript rs;

    public BlurTransformation(Context context) {
        rs = RenderScript.create(context);
    }

    @Override
    public Bitmap transform(Bitmap source) {
        Bitmap blurred = source.copy(Bitmap.Config.ARGB_8888, true);
        Allocation input = Allocation.createFromBitmap(rs, blurred, Allocation.MipmapControl.MIPMAP_FULL, Allocation.USAGE_SHARED);
        Allocation output = Allocation.createTyped(rs, input.getType());
        ScriptIntrinsicBlur blur = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
        blur.setInput(input);
        blur.setRadius(10f);
        blur.forEach(output);
        output.copyTo(blurred);
        source.recycle();
        return blurred;
    }

    @Override
    public String key() {
        return "blur";
    }
}

다중 변환 적용:

List<Transformation> transformations = new ArrayList<>();
transformations.add(new CircleTransformation());
transformations.add(new BlurTransformation(context));

Picasso.with(context)
    .load(url)
    .transform(transformations)
    .into(imageView);

캐시 및 성능 분석

  • 캐시 확인: .setIndicatorsEnabled(true)로 로딩 소스 색상 표시 (파란색=메모리, 초록=디스크, 빨강=네트워크).
  • 로딩 시간 측정: .setLoggingEnabled(true)로 디버그 로그 출력.
  • 사용 통계: StatsSnapshot snapshot = Picasso.with(context).getSnapshot();로 메모리 사용량 등 정보 확인.

커스텀 설정 및 글로벌 인스턴스

기본 설정을 변경하거나 전역 인스턴스로 사용하려면 Builder를 활용한다.

OkHttpClient client = new OkHttpClient.Builder()
    .cache(new Cache(cacheDir, maxSize))
    .build();

Picasso picasso = new Picasso.Builder(context)
    .downloader(new OkHttp3Downloader(client))
    .build();

Picasso.setSingletonInstance(picasso);

다른 라이브러리 비교

  • Glide: GIF 지원, RGB_565 기본 포맷으로 메모리 절약, 생명주기 연동.
  • Fresco: Native 메모리 사용, 진행형 로딩, 고성능 애니메이션 지원.
  • Universal Image Loader: 오래됨, 설정 복잡, GIF 미지원.

각 라이브러리의 특징과 용도에 따라 프로젝트 요구사항에 맞는 선택이 필요하다.

태그: picasso android-image-loading image-caching okhttp3-downloader transformation

7월 2일 18:53에 게시됨