Kotlinにおけるレトロフィット+コウモリの使用


まず第一に、Retrofitは何ですか?
そのウェブサイトが言うように、アンドロイドとJavaのためのタイプ安全なHTTPクライアントです(我々は、Kotlin ...)を使いそうです.だから、基本的にAndroid用のRESTクライアントです.それは私たちが取得し、残りのAPIを通してデータをアップロードするのに役立ちます.
Coroutinesについてはどうですか?
Androidでは、Coroutinesはそれ以外の場合は、メインスレッドをブロックする可能性のある長期的なタスクを管理し、あなたのアプリが無反応になる原因に役立ちます.
さて、基本的な実装を見てみましょう
まず、プロジェクトに依存関係を追加する必要があります.ビルド変数にバージョン変数を追加します.gradle () ,組み込みスクリプト
buildscript {
    ext {
    version_moshi = "1.8.0"
    version_retrofit = "2.5.0"
    version_retrofit_coroutines_adapter = "0.9.2"
    version_kotlin_coroutines = "1.1.0"
    version_retrofit_coroutines_adapter = "0.9.2"
    }
    
}
次に、次の依存関係をビルドに追加します.Gradle ( app )
//coroutines
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$version_kotlin_coroutines"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$version_kotlin_coroutines"
implementation "com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:$version_retrofit_coroutines_adapter"

//Retrofit

implementation "com.squareup.retrofit2:retrofit:$version_retrofit"
implementation "com.squareup.retrofit2:converter-moshi:$version_retrofit"

//moshi
implementation "com.squareup.moshi:moshi:$version_moshi"
implementation "com.squareup.moshi:moshi-kotlin:$version_moshi"
あなたのプロジェクトを構築し、今私たちを開始する準備が整いました.
この例ではAdvice Slip JSON APIを使います.より具体的には、このURLはあなたがそれを呼び出すたびにランダムなアドバイスを返します.
ここでJSONを取得します.
{
  "slip": {
    "id": 45,
    "advice": "Build something out of LEGO."
  }
}
まず最初に、「ネットワーク」という名前の新しいパッケージを作成します.
  • AdviceProperty.KT
  • AdviceApiservice.KT
  • を返します.KTはJSONのプロパティをデータクラス構造に追加します.次のようにします.
    import android.os.Parcelable
    import kotlinx.android.parcel.Parcelize
    
    @Parcelize
    data class AdviceProperty(
        val slip: AdviceData
        ): Parcelable
    
    @Parcelize
    data class AdviceData (
        val id: Int,
        val advice: String
    ): Parcelable
    
    ご覧の通り、我々はJSON構造に従います.我々の最初のデータクラスには、型がAdviceDataであるSLIPというプロパティがあります.この型は、2つのプロパティIDとアドバイスを持つ別のデータクラスです.このようにして、ネストされたJSON構造を複製できます.
    それから、Adviceapiserviceで.KTは私たちのレトロフィットのインスタンスをセットアップします.
    import com.jakewharton.retrofit2.adapter.kotlin.coroutines.CoroutineCallAdapterFactory
    import com.squareup.moshi.Moshi
    import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
    import kotlinx.coroutines.Deferred
    import retrofit2.Retrofit
    import retrofit2.converter.moshi.MoshiConverterFactory
    import retrofit2.http.GET
    
    
    // The base URL where our API is
    private const val BASE_URL = "https://api.adviceslip.com/"
    
    /* Moshi Makes it easy to parse JSON into objects 
    you can use GSON instead if you want*/
    
    private val moshi = Moshi.Builder()
        .add(KotlinJsonAdapterFactory())
        .build()
    
    //Here is our retrofit instance
    
    private val retrofit = Retrofit.Builder()
        .addConverterFactory(MoshiConverterFactory.create(moshi))
        .addCallAdapterFactory(CoroutineCallAdapterFactory())
        .baseUrl(BASE_URL)
        .build()
    
    //Then we are going to create the interface 
    which is going to help to handle our GET method 
    to call the API*/
    
    interface AdviceApiService{
    
        @GET("advice")
        fun getProperty():
                Deferred<AdviceProperty>
    }
    
    /* Singleton to create this instance only once 
    and get it ready every time we call it. */
    
    object  AdviceApi {
        val retrofitService : AdviceApiService by lazy {
            retrofit.create(AdviceApiService::class.java)
        }
    }
    
    よろしい!我々はほとんど完了です!
    私はMVVMアーキテクチャを使用しています.そして、それは私が私のアプリのためにすべてのデータを管理するViewModelクラスを持っている各々の断片/活動とこのAPI呼び出しを意味します.
    それで、ViewModel(これはあなたのクラスでありえます)で、私は私のデータを保存することになっているCloudプロパティという変数を持っています
    private var _properties = MutableLiveData<AdviceProperty>()
    
    次に、他の2つの変数があります.
    private val viewModelJob = Job()
    private val coroutineScope = CoroutineScope( viewModelJob + Dispatchers.Main )
    
    一つ目は、コルーチンのスコープのライフサイクルを定義するジョブです.そのため、子プロセスが失敗した場合は、親に通知し、他の子をキャンセルします.
    つ目はCOOTOINESCOPEです.ここでは、どのスレッドがコルーチンを実行するかを定義します.
    次に、コルーチンを作成し、APIへの呼び出しを管理する方法
    private fun getAdviceProperty(){
    
        coroutineScope.launch { 
    
            var getProperty = AdviceApi.retrofitService.getProperty()
    
            try {
                _properties.value =  getProperty.await()
    
            }catch (e: Exception){
                //library to show logs
                Timber.i("EROR ${e}");
            }
        }
    }
    
    ここで見ることができますので、私たちはcoroutinescopeを持っています.コードのこのブロックを起動すると、新しいcoroutineを作成し、以前に定義したスレッドで実行できます.
    次に、GetProperty変数で「wait」という単語を見ることができます.これは、Singletonクラスが延期されたオブジェクト(Javaでの特徴や約束)を返すからです.
    Viewモデルを使用している場合、onclear ()メソッドのジョブを取り消すことを忘れないでください
    override fun onCleared() {
        super.onCleared()
        viewModelJob.cancel()
    }
    
    そして、それ!我々は今、変数内で我々の反応を持っており、我々は必要に応じてそれを使用することができます.これは、Javaで使用したり、Cooutinesなしで使用するよりもはるかに少ないコードです.
    私のリポジトリを見てみてください.