【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)
            })
        }
    }
    
  • Android Manifest
    추가를 잊지 마십시오<uses-permission android:name="android.permission.INTERNET"/>

    반환 값 정보


    Retroffit의 RxJava2 어댑터를 반환값으로 사용
    Observable, Single, Maybe, Completable
    하지만 각자의 차이를 모르니 조사해 보자.
  • Observable: 자주 사용하기 때문에 힘이 절약됩니다
  • Single
  • onNext+onCompulete=onSuccess에서 onSuccess는 한 번만 불러
  • Maybe
  • onSuccess 또는 onError 또는 onCompulete를 호출하거나 전혀 호출하지 않습니다.
  • Completable
  • onError 또는 onCompulete를 호출하거나 전혀 호출하지 않습니다.
  • 참조 링크

    오류 처리 정보


    200번 데스크톱 이외의 응답 시HttpExceptiononError라고 불린다
    실제 소스 코드
    오류 처리에 관해서는 ↓처럼 처리할 수 있다.
            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'
    
    어떻게 MainActivitymoshi를 생성하는 위치를 바꿉니까
            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을 엄격하게 관리할 수 있다

    관련 링크

  • Retroffit+Gson에서 액세스 API & JSON의 해석 처리를 간단하게 실현
  • 참조된 창고safe-android
  • square/moshi
  • 좋은 웹페이지 즐겨찾기