AndroidでAPIを実装する時の手法をまとめました。
ざっくり説明
- アーキテクチャはシンプルなAndroid MVVM
- API実装には
Retrofit
OkHttp
Moshi
を使用 - 言語はKotlin
- Github Search APIでリポジトリを検索
ソースコード
こちらに置きました。
https://github.com/usk-lab/AndroidGithubApiSample
実装画面
![Screenshot_20200908-144710.png]()単純に検索文字を打ち込み、検索結果を表示します。
API部分の実装
- GithubInterface:APIの定義
- GithubRepository:API処理の実行
- GithubRetrofitProvider:Github用にRetrofitを初期化しGithubRepositoryに提供する
- SearchResponse:レスポンスの定義
APIの定義
GithubInterface.kt
interface GithubInterface {
@GET("/search/repositories")
fun getSearchRepositories(@Query("q") query: String) : Call<SearchResponse>
}
検索結果の処理
MyViewModel.kt
//検索結果
private var _searchResult: MutableLiveData<Result<SearchResponse>> = MutableLiveData()
val searchResult: LiveData<Result<SearchResponse>> get() = _searchResult
....
//リポジトリを検索
fun searchRepository(query: String) {
repository.searchRepository(query).also { response ->
if (response.isSuccessful) {
this._searchResult.postValue(Result.success(response.body()!!))
} else {
this._searchResult.postValue(Result.failure(Throwable(response.errorBody()!!.toString())))
}
}
}
GithubRepositoryで返却される型はResponse<***>
ですが、扱いやすくResult<***>
に変換しています。
また、LiveData
を使い、情報更新を通知しています。
検索結果の表示
MainActivity.kt
private lateinit var viewModel: MyViewModel
private lateinit var adapter: ArrayAdapter<String>
....
viewModel.searchResult.observeForever { result ->
result.onSuccess { response ->
this.adapter.clear()
this.adapter.addAll(response.items.map { it.fullName })
this.adapter.notifyDataSetChanged()
}
result.onFailure {
Timber.e(it.toString())
}
}
検索結果をobserveForever
で受け取っています。
onSuccessの場合は、adapterを更新します。