【Android】Retrofit + Rx
Retrofit
공식 페이지
리트로핏의 Rx화에 관해서는 제이크 신작Adapter을 사용한 것 같다.농담하다
현재 본가의 리트로핏에는 어댑터가 있는 것 같은데, 제이크 신작
DEPRECATED
이 있다.사용여기.
환경 구조
app/build.gradle
에 다음을 추가합니다. implementation 'io.reactivex.rxjava2:rxjava:2.1.6'
implementation 'io.reactivex.rxjava2:rxkotlin:2.1.0'
implementation 'com.squareup.moshi:moshi:1.5.0'
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.4.0'
implementation 'com.squareup.retrofit2:converter-moshi:2.4.0'
이루어지다
간단한 샘플
샘플로도 많은데 Giithub의 API를 사용하여 사용자 정보를 얻는다.
User 클래스(사용자 정보를 저장하는 데이터 클래스)
import com.squareup.moshi.Json
data class User(
@Json(name = "name")
var name: String,
@Json(name = "login")
var login: String,
@Json(name = "blog")
var blog: String,
@Json(name = "type")
var type: String
)
GiithubApi 클래스(interface 정의)
import io.reactivex.Observable
import retrofit2.http.GET
import retrofit2.http.Path
interface GithubApi {
companion object {
const val BASE_URL = "https://api.github.com"
}
@GET("users/{username}")
fun getUser(@Path("username") user: String): Observable<User>
}
MainActivity 클래스
class MainActivity : AppCompatActivity() {
companion object {
val TAG = MainActivity::class.java.simpleName
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val retrofit = Retrofit.Builder()
.baseUrl(GithubApi.BASE_URL)
.addConverterFactory(MoshiConverterFactory.create(Moshi.Builder().build()))
.addCallAdapterFactory(RxJava2CallAdapterFactory.createWithScheduler(Schedulers.io()))
.build()
val service = retrofit.create(GithubApi::class.java)
service.getUser("Slowhand0309").subscribe({ ret ->
Log.d(TAG, "ret $ret")
}, { error ->
Log.e(TAG, error.message)
})
}
}
추가를 잊지 마십시오
<uses-permission android:name="android.permission.INTERNET"/>
반환 값 정보
Retroffit의 RxJava2 어댑터를 반환값으로 사용
Observable, Single, Maybe, Completable
하지만 각자의 차이를 모르니 조사해 보자.
오류 처리 정보
200번 데스크톱 이외의 응답 시
HttpException
는 onError
라고 불린다실제 소스 코드
오류 처리에 관해서는 ↓처럼 처리할 수 있다.
disposable += ApiClient.createUser()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ res ->
Log.d(TAG, "create user success ${res.id}")
}, { error ->
(error as? HttpException)?.let {
Log.e(TAG, "code: ${it.code()}")
Log.e(TAG, "message: ${it.message()}")
Log.e(TAG, "response: ${it.response()}")
}
})
401 반환 시 실제 출력E/MainActivity: code: 401
message:
E/MainActivity: response: Response{protocol=h2, code=401, message=, url=https://....}
방독 기술
단순히moshi를 사용하면 데이터류의non-null 속성에null이 들어옵니다!
참조 링크
그래서moshi의kotlin extension를 가져왔습니다.non-null에null을 넣을 예정입니다
예외를 던지듯이 수정하다
app/build.gradle
에 다음을 추가합니다.implementation 'com.squareup.moshi:moshi-kotlin:1.5.0'
어떻게 MainActivity
moshi를 생성하는 위치를 바꿉니까 val moshi = Moshi.Builder()
.add(KotlinJsonAdapterFactory())
.build()
val retrofit = Retrofit.Builder()
.baseUrl(GithubApi.BASE_URL)
.addConverterFactory(MoshiConverterFactory.create(moshi))
.addCallAdapterFactory(RxJava2CallAdapterFactory.createWithScheduler(Schedulers.io()))
.build()
이렇게 하면non-null/null을 엄격하게 관리할 수 있다관련 링크
Reference
이 문제에 관하여(【Android】Retrofit + Rx), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Slowhand0309/items/a8d2481275fc1949d7be텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)