Android Retrofit2 Rxjava polling
안드로이드에서 웹서버에 있는 데이터를 주기적으로 가져오는 걸 하나 만들어 보았다.
이전에 자바로 개발할때는
retrofit 을 service 에서 돌리고 그걸 handler 로 사용해서 주기적으로 호출하도록 하여
이 값을 broadcasting 하거나 callback 하도록 listener interface 만들어서 데이터를 전달했던 기억이 있다.
하지만, 지금은 kotlin 으로 개발하고 있고
시대가 변해서 시대에 맞게 개발 방법을 찾아 보았다.
retrofit rxjava 조합으로 만들어 보았다.
내용은 인터넷에 있는 내용을 가져와서 동작 시켰고 참조한 사이트와 그에 관련 된 내용을 정리하기로 한다.
참조한 사이트는 아래와 같다.
https://www.journaldev.com/23007/android-retrofit-call-every-x-seconds
사이트에 내용은 간단하다.
webserver 에 get 으로 요청해서 데이터를 가져와서 뿌려주는 내용이다.
소스가 자바로 되어 있다.
나는 자바가 아닌 kotlin 으로 하고 싶은데 자바 소스이다.
하지만 안드로이드 스튜디오는 자바소스를 ctrl+c ctrl+v 하면 자동으로 코드 변환을 해 주기 때문에 그냥 진행해 보았다.
코드 변환이 그냥 잘 된다.
하지만 그렇다고 그냥 다 되는건 아니다.
처음 빠진 내용 json 처리하는 gson 라이브러리가 없다.
https://re-build.tistory.com/41
dependencies {
implementation 'com.google.code.gson:gson:2.8.5'
}
사이트를 참조해서 gson 라이브러리를 넣었다.
그리고, 또문제가 발생했다.
converterFactory 라는 놈이 없다고 한다.
https://onlyfor-me-blog.tistory.com/292
implementation "com.squareup.retrofit2:converter-gson:2.8.1"
해당 라이브러리도 추가해 주었다.
위 사이트에 있는 ScalarsConverterFactory 를 적용할려고 하니 그건 또 다른 라이브러리를 참조해야 할것 같아 그냥 무시하고 ConvertFactory 만 했다.
그러면 가져온 소스를 붙여 넣는것 까지는 되었다.
여기까지 하니 다른 문제가 발생하였다.
Observable 로 구현 구문이 문제가 발생하였다.
이건 가져온 소스를 바로 적용할 수 없어서 그냥 찾아서 대충 만들었다.
private fun callJokesEndpoint(aLong: Long) {
val observable : Observable<Jokes?>? = apiService!!.getRandomJoke("random")
observable!!.subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread())
.map { result: Jokes? -> result!!.value }
.subscribe({joke ->
if (!TextUtils.isEmpty(joke)) {
//textView.setText(joke)
if (joke != null) {
viewModel.setJokeText(joke)
Log.d("xxx",joke)
}
} else {
Toast.makeText(
this, "NO RESULTS FOUND",
Toast.LENGTH_LONG
).show()
}},{ err -> Log.e("xxx", err.toString())})
}
이런 식으로 subscribe 쪽에 직접 구현해 넣었다.
여기까지 하면 activity 기반으로 동작하는것은 끝이다.
하지만, 이렇게 하면 그냥 예제로 끝나지 이걸 그대로 사용할수가 없다.
요즘은 전부 activity fragment 형태로 되어 있고 이렇게 해야 확장이 편하다.
이렇게 하니깐 또 다른 문제가 있다.
activity 에 구현을 하니 표현하는 부분 fragment 쪽으로 데이터 전달이 문제가 발생하였다.
이전 방식은 interface 만들고 listener 만들어서 전달하는 방식이였지만
지금은
https://developer.android.com/guide/fragments/communicate
공식 사이트에 viewmodel 을 이용하고 livedata 를 이용해서 데이터를 전달하라고 한다.
그래서 그렇게 했다.
해당 내용은 github 에 올려 놓았다.
https://github.com/wkyoon/RetrofitRxjavaPollingExample
안드로이드 스튜디오에서 base project 만들어서 거기에 해당 파일만 추가한 형태이다.
댓글
댓글 쓰기