Android Qでは戻るボタンがなくなる…? | ギズモード・ジャパン
Pの実装状態を見る限り明らかに左方向は意図的に開けてるよな。
ピルボタン(ホームボタン) の 使い方 と アプリ履歴 の 一括削除 【Android Pie】
しかし、いまやボタン一つの操作方法多すぎじゃね?
Gboard 日本語 12キー 左右のカーソルキーを使ってすばやく上下移動する方法
いちいち
「ボタンをみたら上下左右にグリグリ」
やってみるとかなあ。
Android Qでは戻るボタンがなくなる…? | ギズモード・ジャパン
Pの実装状態を見る限り明らかに左方向は意図的に開けてるよな。
ピルボタン(ホームボタン) の 使い方 と アプリ履歴 の 一括削除 【Android Pie】
しかし、いまやボタン一つの操作方法多すぎじゃね?
Gboard 日本語 12キー 左右のカーソルキーを使ってすばやく上下移動する方法
いちいち
「ボタンをみたら上下左右にグリグリ」
やってみるとかなあ。
Retrofit の coroutine 対応が進んでいるようです。
Jake Wharton's retrofit2-kotlin-coroutines-adapter has been the go-to solution for bridging the coroutine world with Retrofit for a little while. But now, a much-anticipated PR has finally been merged, officially bringing coroutine support to Retrofit 2.
Retrofit meets coroutines - zsmb.co
SpaceX-API とか公開されていたのですね。
r-spacex/SpaceX-API: Open Source REST API for rocket, core, capsule, pad, and launch data
https://api.spacexdata.com/v3/rockets
対応する最小限のデータクラスを作って、試してみましょう。
data class Rocket(
val id: Int,
@field:Json(name = "rocket_name")
val name: String
)
val retrofit = Retrofit.Builder()
.baseUrl("https://api.spacexdata.com/v3/")
.addConverterFactory(MoshiConverterFactory.create())
.build()
val api = retrofit.create<SpaceXApi>()
create() は reified type が使えるようになってます。
JSONのシリアライズはお好みのものを。
そして、interface を書いていきますが、
ここを戻り値に別に見てみます。
interface はこれまでと同じ記述。
interface SpaceXApi {
@GET("rockets")
fun getRockets(): Call<List<Rocket>>
}
受け側の3つの例。
runBlocking {
val rockets: List<Rocket> = api.getRockets().await()
rockets.forEach(::println)
}
runBlocking {
val rockets: List<Rocket> = try {
api.getRockets().await()
} catch (e: Exception) {
println("Network error :[")
return@runBlocking
}
rockets.forEach(::println)
}
runBlocking {
val response = api.getRockets().awaitResponse()
if (response.code() == 200) {
response.body()?.forEach(::println)
}
}
結果はすべて同じ。
Rocket(id=1, name=Falcon 1)
Rocket(id=2, name=Falcon 9)
Rocket(id=3, name=Falcon Heavy)
Rocket(id=4, name=Big Falcon Rocket)
これまで非同期処理時に必要だった コールバック や enqueue の記述は必要ありません。
受け側の記述を変化させることで、Exception や レスポンスコードを拾うことができます。
suspend を使うことでさらに直感的に書けます。
interface SpaceXApi {
@GET("rockets")
suspend fun getRockets(): List<Rocket>
}
runBlocking {
val rockets = api.getRockets()
rockets.forEach(::println)
}
結果。
Rocket(id=1, name=Falcon 1)
Rocket(id=2, name=Falcon 9)
Rocket(id=3, name=Falcon Heavy)
Rocket(id=4, name=Big Falcon Rocket)
List<Rocket> に対して Call や Deferred のようなラッパーは必要ありません。
Response を拾います。
interface SpaceXApi {
@GET("rockets")
suspend fun getRockets(): Response<List<Rocket>>
}
runBlocking {
val response = api.getRockets()
if (response.code() == 200) {
response.body()?.forEach(::println)
}
}
結果。
Rocket(id=1, name=Falcon 1)
Rocket(id=2, name=Falcon 9)
Rocket(id=3, name=Falcon Heavy)
Rocket(id=4, name=Big Falcon Rocket)
最も実用的で簡潔な記述と思われます。
Kotlin で記述するにしても、多くの記述が可能となりそうです。
RxJava他ライブラリを利用しての非同期実装を含めると様々となります。
ネット上で検索するにも自分の環境や好みに合った記述を探すのにも時間がかかることになり混乱もありそうで。
Jakeも今後はメンテしないと思われます。
ちなみに、これらの話は今現在はSNAPSHOTで進行中です。
以下でどうぞ。
repositories {
maven { url "https://oss.sonatype.org/content/repositories/snapshots" }
}
dependencies {
implementation "com.squareup.retrofit2:retrofit:2.5.1-SNAPSHOT"
}