Retrofit2
interfaceで、get, postのpathを取るパターンと、返すデータ型を決めて、
これをDAO, Data Access Objectという?
Retrofitのビルダーメソッドで、設定をする際に、そのinterfaceをクラスとして取り込んでcreate()する
設定の中に、converterがある。json, protocol buffer, xmlなどに対応した。
logging設定なども、ここで取り込む
最後に、create()の引数に最初に作ったinterfaceの型情報をクラスとして渡して instanceを作成する。
作成されたinstanceは、interfaceで決めたメソッド(post, getなどを実行)を持ち、定められた?データ型を返す
そして通信リクエストを実行する。そのインスタンスは、以下の通信メソッド?を持つ。
非同期が enqueue()
同期がexecute()
欲しいデータが返ってくる。
interface内に定義する関数をsuspend関数にする。
で、インスタンスからinterfaceで定義したリクエストを実行して、response(deferredではなく?)を得る
enqueue()してresponse bodyを
で、メインスレッドのscope上で得たデータをUIに反映させる。
が上手くいかない。
error messageは同じだが、、
libraryのversionを上げたら上手くいった。以下が正しいかは不明だけど、、versionを上げて正常化?したもの
code: build.gradle
implementation "com.squareup.retrofit2:retrofit:2.6.0"
implementation "com.squareup.retrofit2:adapter-rxjava:2.6.0"
implementation "com.squareup.retrofit2:converter-gson:2.6.0"
implementation "com.squareup.okhttp3:okhttp:4.2.0"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.2.1"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.2.1"
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.2.1'
implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'
根本的に、interfaceにmethodの返り値の型を書くと、その型が返ってくるとことがわからん。
coroutineのは、enqueue()までするというのが、、どうなってそうなるのか。
有名な jakewharton氏の retrofit2用のadapterでそうなってる。
deprecatedで、もう必要でなくなったようだ。
参考:
code: retrofit2_coroutine.kt
class HelloActivity : AppCompatActivity() {
private val itemInterface2 by lazy { createService2() }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_hello)
}
//called from the layout file android:onClick
fun getRanking(v: View) {
CoroutineScope(Dispatchers.Main).launch {
//use runCatch()? instead.
try {
val ret = withContext(Dispatchers.IO) { itemInterface2.getRakutenResult2() }
val items = ret.Items.map { it.itemName }
titleRanking.text = ret.title
Log.d("items", items.toString())
listRanking.adapter = ArrayAdapter(this@HelloActivity, android.R.layout.simple_list_item_1, items)
} catch (e: Exception) {
Toast.makeText(this@HelloActivity, e.message, Toast.LENGTH_LONG).show()
//throw e
}
}
}
interface ItemInterface2 {
@GET("IchibaItem/Ranking/20170628?formatVersion=2&applicationId=myID")
suspend fun getRakutenResult2(): RakutenRankingResult
}
fun createService2(): ItemInterface2 {
return Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.baseUrl(baseApiUrl)
.build().create(ItemInterface2::class.java)
}
}