retrofit을 build 하는 부분을 전역적으로 사용할 수 없을까? 에 대한 궁금증 발생
싱글톤 패턴을 이용하면 activity마다 build 할 필요없이 전역적으로 사용 가능하다!
object RetrofitService {
private const val BASE_URL = "" //받아올 URL 을 넣어주면 된다.
val retrofit:Retrofit = Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build()
} // 다음과 같이 만들어 전역적으로 활용함.
data class Movie(
@SerializedName("boxOfficeResult")
var boxofficeResult:BoxOfficeResult
)
data class BoxOfficeResult(
@SerializedName("boxofficeType")
var boxofficeType: String,
@SerializedName("showRange")
var showRang: String,
@SerializedName("yearWeekTime")
var yearWeekTime:String,
@SerializedName("weeklyBoxOfficeList")
var weeklyBoxOfficeList : List<WeeklyBoxOfficeList> = arrayListOf()
)
data class WeeklyBoxOfficeList (
@SerializedName("rnum")
var rnum: String?, //순번
@SerializedName("rank")
var rank : String?, //박스오피스 랭킹
@SerializedName("movieNm")
var movieNm: String?, //영화이름
@SerializedName("openDt")
var openDt: String?, //개봉일
@SerializedName("audiAcc")
var audiAcc: String?, //누적 관객수
)
유의: 이름과 자료형을 잘 맞추지 않으면 null 값이 들어오는 경우가 발생한다.
데이터 받는 부분
val retrofit = RetrofitService.retrofit
retrofit.create(RetrofitAPI::class.java).getMovie(keyValue,0,20220101,10)
.enqueue(object : Callback<Movie> {
override fun onResponse(call: Call<Movie>, response: Response<Movie>) {
Log.e("Success",response.body().toString())
val dataList = response.body()?.boxofficeResult?.weeklyBoxOfficeList
initAdapter(dataList) // 받은 값의 리스트들을 RVAdapter에 넣어줬다.
}
override fun onFailure(call: Call<Movie>, t: Throwable) {
Log.e("Failure",t.message.toString())
}
})
실제로 받은 데이터들의 모습을 Log로 찍어봤다. (Log.e인 이유는 눈에 잘 보이기 위함.)