마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

json에 이미지 주소를 저장하여 불러오려고 하는데 오류가 발생하고 있습니다.

0 추천

안녕하세요. 공부를 하면서 간단한 앱을 만들어보고 있습니다.

현재 만들려고 하는 기능이 drawable에 들어있는 이미지 주소를 json에 저장해두고 바로 출력하는 것이 목적입니다. 그렇기에 아래 처럼 코드를 구성해두었습니다.

{
  "data": {
    "diary_list": [
      {
        "name": "게임1",
        "title": "소제목 - 게임1",
        "url": "R\\drawable\\gameimage",
        "key": 1
      },
    ]
  }
}

이렇게 구성을 해둔 상황입니다. 그리고 이를 불러오는 코드로는

val iObj =
                listStore.getJSONObject("$position".toInt()) // 이거 우선 이렇게 사용하고 다른 해결책을 찾아봐야겠다.
val name = iObj.getString("title")
val imgUrl = iObj.getString("url")

contentTitle.text = name

Glide.with(itemView)
    .load(imgUrl)
    .error(R.drawable.error_round35_border2)
    .into(contentImage)

이렇게 코드를 구성해둔 상태입니다. 그런데 text는 잘 나오기에 코드 상에서 잘못 짠 것은 없는 것 같습니다.

제가 추측하기로는 url을 load가 제대로 인식하지 못하는 것 같기는 한데 이를 어떻게 해야 제대로 처리할 수 있는지를 모르겠습니다. 인터넷을 찾아봐도 좋은 해결책이 보이지 않아 이렇게 질문을 올립니다.

직접적으로 R.drawable.image를 입력하는 방법은 제대로 작동하고 있습니다.

그리고 사용해야 되는 이미지가 많아 if문으로 하나하나 거르기에는 까다로울 것 같고, 인터넷에서 데이터를 가져오자니 별도의 이미지 편집을 거치고 출력을 하는 것이기에 따로 편집하고 저장해 둔것을 출력하려는 목적이 있어 이렇게 시도해보았습니다.

혹시 어떤 방법을 사용해야 이를 해결할 수 있을까요?

UNUMUNU (150 포인트) 님이 2023년 11월 22일 질문

3개의 답변

0 추천
Glide에서 어떤 에러가 나오는지 에러메세지를 먼저 잘 확인하세요. 어떤 에러인지를 알아야 해결방법을 찾을 수 있겠죠. 그리고 브레이크 포인트 설정하셔서 imgUrl에 실제로 어떤 값이 들어오는지 확인하시고 이걸 브라우져에서 잘 동작하는지 확인해 보세요.
모발쪽에서는 JSON파싱한 값이 제대로 되었는지 체크하시고 혹 서버에서 오는 이미지 URL이 잘못된 것이면 서버에서 URL을 고쳐줘야 겠죠.
참고로 이미지 사이즈가 아주 큰 것이 아니라면 리모트로 이미지를.보여주더라도 성능상의 차이가 확 나지는 않습니다. Glide가 내부적으로 캐시 관리를 효율적으로 해줍니다. 또한 preload를 사용하면 좀 더 빠르게 이미지를 로딩할 수 있습니다.
spark (227,530 포인트) 님이 2023년 11월 22일 답변
spark님이 2023년 11월 24일 수정
제가 질문을 살짝 잘 못 이해했네요. 다시 잘 읽어보니 R.drawable 있는 리소스 값을 Glide에 사용하려고 하시는거네요. 이런 경우는 아래에 있는 분이 말씀하신 것 처럼 Resource Identifier를 사용하면 되는데요. 제 생각에 더 좋은 방법은 서버에서 해당 이미지를 호스팅하고 이미지 URL을 리턴하는게 더 좋은 것 같습니다. 요즘은 무료로 이런 이런 서비스를 제공하는 곳들이 많습니다.  예를 들면 https://cloudinary.com/에 이미지를 올려놓고 사용하셔도 됩니다. 물론 이게 싫으시면 앞에서 처럼 Resource Identifier를 사용하시면 됩니다.
0 추천

엇... R.drawable.gameimage 는 url은 아닌거 같네요(로컬에 저장된 이미지파일의 참조임)... 그치만 직접 입력하면 된다고 하시니(glide에서 지원은하는가 봅니다.)...

이것은 코드상에서 직접입력하면 실제 참조값은 숫자입니다. ( 물론 동적으로 변하니 숫자를 json에 넣는건 답이 될 수 없고요 )

일단은 풀기 쉽지 않은 문제인데요,

코드상의 참조값을 json을 넣는건 바람직해보이지 않습니다.

이미지파일의 로컬에서 절대경로를 json에 넣는게 어떨까 싶은데요, 물론 이 경우 해상도에따라 이미지를 선택해주는 sdk기능을 활용할 수 없겠네요.

 

만약 json을 굳이 쓸필요가없다면

map 같은 자료구조를 이용하여 image참조를 int로 받아 저장하는것이 좋을 거 같습니다.

minukobba (880 포인트) 님이 2023년 11월 23일 답변
0 추천

R.drawable.gameimage 로 저장하실 값 같은데,
json에 문자 자체가 잘 못 들어가는듯 합니다.
또한  R.drawable.gameimage 는 리소스 인덱스와 매핑되며,
컴파일할 때마다 달라질 수 있는 값이라 문자열로 저장해봐야, 런타임에서는 못 찾습니다. 
string으로 저장 시  아래와 링크를 참조하셔서  리소스 id를 구하는 함수를 써서 런타임 중 int로 변환한 값을  Glide에 넣어주셔야 찾을 수 있습니다.

https://stackoverflow.com/questions/4427608/android-getting-resource-id-from-string

익명사용자 님이 2023년 11월 23일 답변
...