2019. 11. 5. 16:02ㆍProgramming/Android
API를 호출했을 때 Content-type
이 image/jpeg
로 설정되는 경우, 응답에 JPEG
파일이 실려오게 된다. 크롬의 개발자 도구에서 네트워크 탭을 통해 응답을 확인해보면, 실제로 이미지 파일이 응답 본문(Response Body)에 실려오는 것을 볼 수 있다. 그렇다면 Android에서 Retrofit2
를 이용하여, 이러한 Bitmap을 처리하려면 어떻게 해야할까?
우선은 아래와 같이 interface
를 작성해준다. 파일 용량이 적을 경우에는 @Streaming
을 생략해도 잘 동작한다. Call
에 넘겨주는 ResponseBody
는 okhttp3
패키지의 ResponseBody
이다.
JAVA를 사용하여 작성한 코드
public interface DonwloadImage { @GET("images/{apiName}") @Streaming //용량이 적을 경우 @Streaming은 생략이 가능하다. Call<ResponseBody> downloadImage(@Path("apiName") String apiName); }
KOTLIN을 사용하여 작성한 코드
interface DownloadImage { @GET("images/{apiName}") @Streaming //용량이 적을 경우 @Streaming은 생략이 가능하다. downloadImage(@Path("apiName") apiName:String):Call<ResponseBody>; }
interface
를 작성했다면 Retrofit2
를 이용하여 API를 호출해주면 된다. 응답을 받아서 Bitmap
객체를 이용해 이미지를 처리하려면, 다음과 같이 코드를 작성하자. 이미지의 로우 데이터는 response.body()
를 byteStream
으로 읽어들여서, BitmapFactory.decodeStream
으로 디코딩하면 Bitmap
객체가 반환된다. 이제 처리가 끝난 Bitmap
객체를 이용해 저장하거나 화면상에 띄우는 작업을 할 수 있다.
JAVA를 사용하여 작성한 코드
new Callback<ResponseBody>(){ @Override public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { InputStream is = response.body().byteStream(); Bitmap bitmap = BitmapFactory.decodeStream(is); } }
KOTLIN을 사용하여 작성한 코드
object: Callback<String> { override fun onResponse(call: Call<String>, response: Response<String>) { val is = response.body().byteStream() val bitmap = BitmapFactory.decodeStream(is) } }
같은 방법으로 서버에서 파일을 다운받아, 클라이언트에 저장하는 등의 처리도 가능하다. 해당 내용은 How to download Files from server - Future Studio의 내용을 참조하도록 하자.
참조
Retrofit 2 download image and save to folder - StackOverflow
How to download Files from server - Future Studio
'Programming > Android' 카테고리의 다른 글
Retrofit2를 사용하여 서버의 Digest 인증을 처리하기 (0) | 2019.11.19 |
---|---|
CLEARTEXT communication to [TARGET_ADDRESS] not permitted by network security policy (0) | 2019.11.08 |
Kotlin <-> Java 클래스를 서로 참조 못할 때(Can not find symbol) (0) | 2019.11.03 |
어플리케이션의 HTTP 라이브러리를 Volley에서 Retrofit2로 교체한 후기 #1 (0) | 2019.10.24 |
3일에 걸친 리펙토링을 하고나서, 코드를 잘 작성하는 법에 대해 생각해봤다. (2) | 2019.09.15 |