- 전체
- 명
- 오늘 찾아주신 분
- 명
이전 포스팅에서는 Glide 에서 PDF 를 로드할 수 있도록 도와주는 ModelLoader 와 DataFetcher 구현하는 방법에 대해 작성해보았다. 조회수 올리게 이전 포스팅을 보고 오세용
PDF 를 Glide 에서 작동시키기 위한 구현 절차를 다시 보면,
1. ModelLoader 를 구현한다
2. DataFetcher 를 구현한다
3. ModelLoader 에서 쓸 수 있도록 만든다
4. AppGlideModule 에 등록한다
였는데, 이전 포스팅 까지 해서 1,2,3 번 과정을 다루어 보았고 이제 마지막 4번 절차와 앱에서 실행하는 일만 남았다.
AppGlideModule 은 첫번째 포스팅이었던 기초공사 작업에서 GlideApp 을 만들게 해주었을 때 생성했던 클래스인데 기억이 나지 않는다면 한번 다시 조회수 올리게 보고오자.
AppGlideModule 을 상속받은 해당 클래스 내에 override 된 registerComponents() 에 지금까지 작업한 것들을 넣을 것이다.
방식은 registry 라는 파라미터를 이용해서 등록만 해주는 것인데, 이 파라미터에는 다양한 것들이 존재하는데 그 중에서 prepend() 메소드를 사용하여 등록을 해 주도록 한다. append() 메소드도 있긴 한데, append 메소드는 새로 만든 것을 등록하기 보다는 기존 Glide 렌더하는 기능에 추가기능을 부여하는 것을 개발할 때 사용한다고는 써있는데 잘 모르겠다. 일단 공식문서에 나와있는 대로 따라서 해보면,
override fun registerComponents(context: Context, glide: Glide, registry: Registry) {
registry.prepend(Uri::class.java, ByteBuffer::class.java, PDF_MODEL_LOADER_FACTORY) // PDF 로더
}
이런 형식이 되는데 여기서 한가지 걸리는 것은, 등록할 때에는 ModelLoader 본연의 클래스가 아닌 ModelLoaderFactory 라는 것을 구현하여 ModelLoader 를 전달해야 한다는 것이다. 파라미터 타입 값을 확인해보면,
마지막 파라미터가 ModelLoaderFactory<Model, Data> factory 로 되어있는 것을 볼 수 있다. 그래서 ModelLoader 내부에 Factory 클래스를 구현해 보도록 한다
class PDFModelLoader private constructor (private val context: Context) : ModelLoader<Uri, ByteBuffer>() {
/* 코드를 짠다. 막 짠다 */
class Factory (private val context: Context) : ModelLoaderFactory<Uri, ByteBuffer>(){
override fun build(multiFactory: MultiModelLoaderFactory): ModelLoader<Uri, ByteBuffer> = PDFModelLoader(context)
override fun teardown() {}
}
}
Factory 클래스를 상속받으면 2가지의 override 메소드가 입력되는데, teardown 은 문서에서 빈칸으로 냅두라고 해서 냅뒀다. 무슨 역할을 하는 지는 잘 모른다. 그리고 build 에서 단순하게 ModelLoader 를 생성하고 리턴시켜주면 된다. context 는 ModelLoader 와 DataFetcher 내부에서 파일을 불러오거나 할 때 사용해야 하기 때문에 context 를 삽입했다. 그리고 Factory 클래스로만 접근하기 때문에 PDFModelLoader 는 private constructor 로 외부에서의 생성을 차단시켰다.
그럼 다시 AppGlideModule 클래스로 돌아와 등록을 해보면,
override fun registerComponents(context: Context, glide: Glide, registry: Registry) {
registry.prepend(Uri::class.java, ByteBuffer::class.java, PDFModelLoader.Factory(context)) // PDF 로더
}
마지막 파라미터는 Factory 클래스를 생성하면 되는 것이다.
여기까지 길고 긴 Glide ModelLoader 생성에 대해 알아보았다. ViewPager 에서 PDF 가 작동 되도록 실행해 보도록 하자.
일단 뭐, ViewPager 에 Fragment 로 View 구성이 잘 되었다면 ImageView 를 타겟 삼아 Glide 객체를 불러온다.
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
val uri = requireArguments().getString(KEY_PDF_URI)
val page = requireArguments().getInt(KEY_PAGE)
with(view){ this as ImageView
GlideApp.with(context).asBitmap().load(Uri.parse(uri)).page(page).into(this)
}
}
Uri 와 Page 번호를 받아온 후 기본 Glide 를 사용하는 방식으로 PDF 파일을 로드하면 된다. 주의할 점은 Glide.with(context) 가 아니라 GlideApp.with(context) 로 사용해야 한다는 것이다.
그리하여 나온 결과물은,
프로미 PDF 감사.
여기까지 Glide 와 PDF 연동에 대해 알아보았고, 풀 소스는 다음 링크에서 확인 해 볼 수 있다. 그럼 포스팅 끝~
[Android] Logcat 에서 보고 싶은 태그만 필터링하기 (0) | 2022.05.16 |
---|---|
[Android] Web 에서 App 으로 데이터를 받아보자 (0) | 2022.02.04 |
[Android] Glide with PDF -2(ModelLoader, DataFetcher)- (0) | 2022.01.31 |
[Android] Glide with PDF -1(기초공사)- (0) | 2022.01.26 |
[Kotlin] 문자열 배열 한글, 영문, 숫자로 정렬 시키기 (0) | 2022.01.26 |