본문 바로가기

Dev/안드로이드

[안드로이드 짤막공부] 23.09.30

 카카오 API를 이용한 미디어 검색 앱을 만들던 도중, 오랜만에 오류를 겪었다.

 

 대강 이런 오류였는데 아무래도 API를 통해 받아온 데이터를 바인딩하는 과정에서 오류가 나는 거 같았다. 유독 VideoItem의 playTime을 받아올 때만 오류가 발생했다.

 처음에는 API의 response 값을 받아올 때 VideoItem에 대해 잘못된 값을 참조해서 존재해야 할 값이 없는가 해서 Postman으로 직접 API를 호출해 보니, response로 주어지는 인자들의 이름은 모두 제대로 SerializedName으로 처리해 둔 상태였다. 실제로 Retrofit 객체를 통해 전달받은 데이터들을 Log로 찍어 확인해 본 결과 모두 정상적으로 받아 오고 있었다.

 그래서 문제가 발생한 ItemVideoBindingImpl.java 코드를 뜯어서 확인해보니까 item_video.xml 파일의

<androidx.appcompat.widget.AppCompatTextView
    android:id="@+id/playTimeTextView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="4dp"
    android:text="@{item.playTime + `초`}"
    app:layout_constraintStart_toStartOf="@id/titleTextView"
    app:layout_constraintTop_toBottomOf="@id/titleTextView" />

이 부분을 데이터 바인딩 처리할 때, item.playTime + '초' 를 담아두는 객체가 Int 형으로 생성되어 있었다(스크린샷을 남기지는 못했다). 그래서 setText() 메소드를 불러올 때 Int형을 집어넣게 되니 오류가 발생하는 듯했다.

 자바 코드가 대체 왜 그렇게 생성되었는지는 모르겠으나, 어쩔 수 없이 문제가 생기는 부분을

<androidx.appcompat.widget.AppCompatTextView
    android:id="@+id/playTimeTextView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="4dp"
    android:text="@{String.valueOf(item.playTime) + `초`}"
    app:layout_constraintStart_toStartOf="@id/titleTextView"
    app:layout_constraintTop_toBottomOf="@id/titleTextView" />

위와 같이 변경하니까 그제야 오류가 발생하지 않았다.

 

이제서야 String으로 선언하는 코드가 생성됐다.

 

 그런데, 이후에 이 오류를 재현하기 위해 xml 파일을 원복 시키고 다시 빌드했더니 정상적인 자바코드가 생성되어 오류가 발생하지 않았다.. 내 안드로이드 스튜디오의 기분이 잠깐 안 좋았던 건가 싶다.