Kotlinを使用したAndroidでのレトロフィット

画像







今年のGoogle I / Oで最もエキサイティングな広告の1つは、Android開発のためのKotlinの公式サポートです。







Kotlinは実際には新しい言語ではありません;彼はすでに5歳以上でかなり成熟しています。 ここで 、言語に関する詳細情報を取得できます。







Android開発でKotlinを使用する「プラクティス」の一部を共有する予定です。







Retrofitは非常に人気のあるネットワークライブラリであり、開発コミュニティで広く使用されています。 Googleでさえ、コードサンプルで使用しています。







この記事では、Retrofit + Kotlin + RxJavaを使用して、アプリケーションでREST APIを使用する方法について説明します。 Github APIを使用して、ロシアのオムスクにあるJava開発者のリストを取得します。 また、プログラミング言語のいくつかの機能に触れ、それらをAndroid開発者が日々行うものに適用する方法について話します-APIを呼び出します。







0.インストール



Android Studio 3.0(プレビュー)は、プラグインを手動でインストールすることなく、ネイティブKotlinをサポートするようになりました。 ここから 、プレビューバージョンをインストールできます。







1.依存関係を追加する



Retrofitを使用するには、 build.gradleファイルに依存関係を追加する必要があります。







dependencies { // retrofit compile "com.squareup.retrofit2:retrofit:2.3.0" compile "com.squareup.retrofit2:adapter-rxjava2:2.3.0" compile "com.squareup.retrofit2:converter-gson:2.3.0" // rxandroid compile "io.reactivex.rxjava2:rxandroid:2.0.1" }
      
      





RxJava2は、呼び出しをリアクティブにするのに役立ちます。

GSONコンバーターは、要求本文と応答本文の逆シリアル化とシリアル化を処理します。

RxAndroidは、RxJava2をAndroidにバインドするのに役立ちます。







2.データクラスの作成



通常、次のステップは、API呼び出しへの応答を表すPOJO(Plain Old Java Object)であるデータクラスを作成することです。







Github APIを使用すると、ユーザーはオブジェクトとして表されます。







Kotlinでの表示方法:







 data class User( val login: String, val id: Long, val url: String, val html_url: String, val followers_url: String, val following_url: String, val starred_url: String, val gists_url: String, val type: String, val score: Int )
      
      





Kotlinのデータクラス



Kotlinデータクラスは、データを保存するために特別に設計されたクラスです。







Kotlinコンパイラは、 クラスに equals()hashCode()、およびtoString()メソッドを実装するのを自動的に支援します。これにより、独自にこれを行う必要がないため、コードがさらに短くなります。







メソッドを定義することにより、これらのメソッドのデフォルト実装をオーバーライドできます。







すばらしい機能は、単一のKotlinファイル( SearchResponse.ktなど)で検索結果を作成できることです。 最終的な検索応答クラスには、関連するすべてのデータクラスが含まれ、次のようになります。







SearchResponse.kt







 data class User( val login: String, val id: Long, val url: String, val html_url: String, val followers_url: String, val following_url: String, val starred_url: String, val gists_url: String, val type: String, val score: Int ) data class Result (val total_count: Int, val incomplete_results: Boolean, val items: List<User>)
      
      





3. APIの作成



Javaで通常行う次のステップは、リクエストの作成とレスポンスの受信に使用するAPIを作成することです。







通常、Javaでは、必要なときにAPIサービスを作成する便利な「ファクトリー」クラスを作成し、次のようにします。







GithubApiService.java







 public interface GithubApiService { @GET("search/users") Observable<Result> search(@Query("q") String query, @Query("page") int page, @Query("per_page") int perPage); /** * Factory class for convenient creation of the Api Service interface */ class Factory { public static GithubApiService create() { Retrofit retrofit = new Retrofit.Builder() .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .addConverterFactory(GsonConverterFactory.create()) .baseUrl("https://api.github.com/") .build(); return retrofit.create(GithubApiService.class); } } }
      
      





このインターフェイスを使用するには、次の呼び出しを行います。







 GithubApiService apiService = GithubApiService.Factory.create(); apiService.search(/** search parameters go in here **/);
      
      





Kotlinで同じことを繰り返すために、同等のインターフェースGithubApiService.ktがあり 、これは次のようになります。







GithubApiService.kt







 interface GithubApiService { @GET("search/users") fun search(@Query("q") query: String, @Query("page") page: Int, @Query("per_page") perPage: Int): Observable<Result> /** * Companion object to create the GithubApiService */ companion object Factory { fun create(): GithubApiService { val retrofit = Retrofit.Builder() .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .addConverterFactory(GsonConverterFactory.create()) .baseUrl("https://api.github.com/") .build() return retrofit.create(GithubApiService::class.java); } } }
      
      





このインターフェイスとファクトリクラスを使用すると、次のようになります。







 val apiService = GithubApiService.create() apiService.search(/* search params go in here */)
      
      





メソッドを参照するためにコンパニオンオブジェクトの「名前」を使用する必要はなく、クラス名のみを使用したことに注意してください。







Kotlinのシングルトンと関連オブジェクト



Kotlinにある関連オブジェクトの種類を理解するには、まず、Kotlinにあるオブジェクトのアナウンスメントを理解する必要があります。 Kotlinでオブジェクトを宣言することは、Kotlinで単一の要素を作成する方法です。







Kotlinのシングルトーンは、オブジェクトを宣言して名前を付けるのと同じくらい簡単です。 例:







 object SearchRepositoryProvider { fun provideSearchRepository(): SearchRepository { return SearchRepository() } }
      
      





上記のオブジェクト宣言を使用:







 val repository = SearchRepositoryProvider.provideSearchRepository();
      
      





これにより、リポジトリインスタンスを提供するプロバイダーを作成できました(GithubApiServiceを介してGithub APIに接続するのに役立ちます)。







シングルトンが動作するように、オブジェクト宣言は最初のアクセスで初期化されます。







ただし、 コンパニオンオブジェクトは、コンパニオンキーワードと一致するオブジェクト宣言タイプです。 コンパニオンオブジェクトは、Javaの静的メソッドまたはフィールドと比較できます。 実際、Javaでコンパニオンオブジェクトを参照する場合、静的メソッドまたはフィールドのように見えます。







コンパニオンオブジェクトは、上記のGithubApiService.kt Kotlinのバージョンで使用されているものです。







4.リポジトリの作成



プロセスを可能な限り抽象化しようとするため、GithubApiService呼び出しを処理してクエリ文字列を作成する単純なリポジトリを作成できます。







Github APIを使用した(OmskでJava開発者を検索するための)このデモアプリケーションの仕様に一致するクエリ文字列は、場所:Omsk +言語:Javaです。そのため、場所を渡してパラメータとしての言語。







検索リポジトリは次のようになります。







 class SearchRepository(val apiService: GithubApiService) { fun searchUsers(location: String, language: String): Observable<Result> { return apiService.search(query = "location:$location+language:$language") } }
      
      





Kotlinの文字列テンプレート



上記のコードブロックでは、「文字列テンプレート」と呼ばれるKotlin関数を使用してクエリ文字列を作成しました。 文字列パターンはドル記号で始まります-$およびそれに続く変数の値は、文字列の残りと連結します。 これは、groovyでの文字列補間の同様の機能です。







5. RxJavaを使用してリクエストを行い、APIレスポンスを取得します



リポジトリインターフェイスである応答クラスを構成したので、RxJavaを使用して要求を作成し、API応答を取得できるようになりました。 このステップは、Javaでこれを行う方法と似ています。 Kotlinコードでは、次のようになります。







 val repository = SearchRepositoryProvider.provideSearchRepository() repository.searchUsers("Omsk", "Java") .observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.io()) .subscribe ({ result -> Log.d("Result", "There are ${result.items.size} Java developers in Lagos") }, { error -> error.printStackTrace() })
      
      





要求を行い、応答を受け取りました。 今、私たちは彼とやりたいことが何でもできる。







便利なリンク:





おわりに



したがって、この投稿では、Kotlin言語のいくつかの興味深い機能/プロパティと、ネットワークコールにRetrofit + RxJavaを使用する場合の使用方法を調べました。







影響を受けました:










All Articles