🐡
Androidアプリを1から作る時にハマったメモ
こちらを作る時にハマった点の紹介です。
Retrofitのsuspend忘れ
java.lang.IllegalArgumentException: Could not locate call adapter for retrofit2.Response<com.example.network.data.ListScreenReponse>.
Tried:
* retrofit2.CompletableFutureCallAdapterFactory
* retrofit2.DefaultCallAdapterFactory
こんな例外が出て困惑しました。
DI関連は昔作ったプロジェクトから持ってきているし、
Responseのdata classも単純な物なので混乱・・・
Retrofit公式ISSUEでJake神がcroutine対応大変なんだよね〜的な事を言ってるのを見かけて、
suspendが付いてないと気付いて直せました。
NGなコード(suspend忘れ)
interface ListService {
@Mock
@MockResponse(body = "{\"location\":\"421 Lewis Ave,aaaaaaaaaaaa\",\"chips\":[{\"id\":0,\"title\":\"TITLE0\"},{\"id\":1,\"title\":\"TITLE1\"},{\"id\":2,\"title\":\"TITLE2\"},{\"id\":3,\"title\":\"TITLE3\"},{\"id\":4,\"title\":\"TITLE4\"},{\"id\":5,\"title\":\"TITLE5\"},{\"id\":6,\"title\":\"TITLE6\"},{\"id\":7,\"title\":\"TITLE7\"},{\"id\":8,\"title\":\"TITLE8\"},{\"id\":9,\"title\":\"TITLE9\"},{\"id\":10,\"title\":\"TITLE10\"}],\"campaign\":{\"title\":\"Unlimited \$0 delivery fees\",\"target\":\"\$0 delivery\"},\"populars\":[{\"imageUrl\":\"https://github.com/fanzeyi/pokemon.json/blob/master/images/000.png\",\"stars\":\"4.8 (2.9k ratings)\",\"title\":\"TITLE0\",\"time\":\"25-35 mins\"},{\"imageUrl\":\"https://github.com/fanzeyi/pokemon.json/blob/master/images/001.png\",\"stars\":\"4.8 (2.9k ratings)\",\"title\":\"TITLE1\",\"time\":\"25-35 mins\"},{\"imageUrl\":\"https://github.com/fanzeyi/pokemon.json/blob/master/images/002.png\",\"stars\":\"4.8 (2.9k ratings)\",\"title\":\"TITLE2\",\"time\":\"25-35 mins\"},{\"imageUrl\":\"https://github.com/fanzeyi/pokemon.json/blob/master/images/003.png\",\"stars\":\"4.8 (2.9k ratings)\",\"title\":\"TITLE3\",\"time\":\"25-35 mins\"},{\"imageUrl\":\"https://github.com/fanzeyi/pokemon.json/blob/master/images/004.png\",\"stars\":\"4.8 (2.9k ratings)\",\"title\":\"TITLE4\",\"time\":\"25-35 mins\"},{\"imageUrl\":\"https://github.com/fanzeyi/pokemon.json/blob/master/images/005.png\",\"stars\":\"4.8 (2.9k ratings)\",\"title\":\"TITLE5\",\"time\":\"25-35 mins\"},{\"imageUrl\":\"https://github.com/fanzeyi/pokemon.json/blob/master/images/006.png\",\"stars\":\"4.8 (2.9k ratings)\",\"title\":\"TITLE6\",\"time\":\"25-35 mins\"},{\"imageUrl\":\"https://github.com/fanzeyi/pokemon.json/blob/master/images/007.png\",\"stars\":\"4.8 (2.9k ratings)\",\"title\":\"TITLE7\",\"time\":\"25-35 mins\"},{\"imageUrl\":\"https://github.com/fanzeyi/pokemon.json/blob/master/images/008.png\",\"stars\":\"4.8 (2.9k ratings)\",\"title\":\"TITLE8\",\"time\":\"25-35 mins\"},{\"imageUrl\":\"https://github.com/fanzeyi/pokemon.json/blob/master/images/009.png\",\"stars\":\"4.8 (2.9k ratings)\",\"title\":\"TITLE9\",\"time\":\"25-35 mins\"}],\"perks\":[{\"imageUrl\":\"https://github.com/fanzeyi/pokemon.json/blob/master/images/000.png\",\"stars\":\"4.8 (2.9k ratings)\",\"title\":\"TITLE0\",\"time\":\"25-35 mins\"},{\"imageUrl\":\"https://github.com/fanzeyi/pokemon.json/blob/master/images/001.png\",\"stars\":\"4.8 (2.9k ratings)\",\"title\":\"TITLE1\",\"time\":\"25-35 mins\"},{\"imageUrl\":\"https://github.com/fanzeyi/pokemon.json/blob/master/images/002.png\",\"stars\":\"4.8 (2.9k ratings)\",\"title\":\"TITLE2\",\"time\":\"25-35 mins\"},{\"imageUrl\":\"https://github.com/fanzeyi/pokemon.json/blob/master/images/003.png\",\"stars\":\"4.8 (2.9k ratings)\",\"title\":\"TITLE3\",\"time\":\"25-35 mins\"},{\"imageUrl\":\"https://github.com/fanzeyi/pokemon.json/blob/master/images/004.png\",\"stars\":\"4.8 (2.9k ratings)\",\"title\":\"TITLE4\",\"time\":\"25-35 mins\"},{\"imageUrl\":\"https://github.com/fanzeyi/pokemon.json/blob/master/images/005.png\",\"stars\":\"4.8 (2.9k ratings)\",\"title\":\"TITLE5\",\"time\":\"25-35 mins\"},{\"imageUrl\":\"https://github.com/fanzeyi/pokemon.json/blob/master/images/006.png\",\"stars\":\"4.8 (2.9k ratings)\",\"title\":\"TITLE6\",\"time\":\"25-35 mins\"},{\"imageUrl\":\"https://github.com/fanzeyi/pokemon.json/blob/master/images/007.png\",\"stars\":\"4.8 (2.9k ratings)\",\"title\":\"TITLE7\",\"time\":\"25-35 mins\"},{\"imageUrl\":\"https://github.com/fanzeyi/pokemon.json/blob/master/images/008.png\",\"stars\":\"4.8 (2.9k ratings)\",\"title\":\"TITLE8\",\"time\":\"25-35 mins\"},{\"imageUrl\":\"https://github.com/fanzeyi/pokemon.json/blob/master/images/009.png\",\"stars\":\"4.8 (2.9k ratings)\",\"title\":\"TITLE9\",\"time\":\"25-35 mins\"}]}")
@GET("localhost/list")
fun getListScreenData(): Response<ListScreenReponse>
}
kotlinx-serialization指定忘れ
kotlinx.serialization.SerializationException: Serializer for class 'ListScreenReponse' is not found.
Mark the class as @Serializable or provide the serializer explicitly.
Retrofitのsuspend忘れが解決するとJson関連のエラーが出ました。
@Serializableも忘れてないのに不思議だな〜と思っていたのですが、
build.gradleを見ると一度もserialization
と言う単語が存在しませんでした。
※dependenciesに指定はしてあったのですが、VersionCatalogsでまとまっていたのでserializationが存在しなかった
Dangerが出んじゃー
/opt/hostedtoolcache/Ruby/2.6.10/x64/lib/ruby/gems/2.6.0/gems/octokit-4.22.0/lib/octokit/response/raise_error.rb:14:in `on_complete': PATCH https://api.github.com/repos/sobaya-0141/sample202207/issues/comments/1224036023: 401 - Requires authentication // See: https://docs.github.com/rest/reference/issues#update-an-issue-comment (Octokit::Unauthorized)
一見401エラーでDangerがコメントを書けて無さそうです。
これはトラップでDangerの古いバージョンを指定して使うと発生します。
こけた時
gem install danger:6.2.0
面倒だったのでバージョン指定を解除して解決
Workload Identity Federation何を指定するの?
- id: 'auth'
name: 'Authenticate to Google Cloud'
uses: 'google-github-actions/auth@v0'
with:
workload_identity_provider: ${{ secrets.WIF }}
service_account: ${{ secrets.SERVICE_ACCOUNT }}
secrets.WIF
って何を指定すればいいか分かりにくかったのですが、
この画面のidをクリック
この画面のIAMプリンシパルのprojects/〜
をコピペすればOKでした。
Discussion