Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save senseilearning/26af010f7df55d7d73cad29a91237588 to your computer and use it in GitHub Desktop.
Save senseilearning/26af010f7df55d7d73cad29a91237588 to your computer and use it in GitHub Desktop.
MediaBrowserCompat の connect() メソッドで Type checking has run into a recursive problem というエラーが出る場合、多くは コールバックの型推論が原因です。
このエラーは、MediaBrowserConnectionCallback を匿名クラスとして connect() メソッドの引数に直接記述する際に、Kotlinコンパイラが型を正しく推論できずに再帰的なループに陥ってしまうことで発生します。
解決策
この問題を解決するには、以下の2つの方法が有効です。
1. コールバックを変数として定義する
最も簡単で推奨される方法は、MediaBrowserConnectionCallback のインスタンスを一度変数に格納してから connect() メソッドに渡す方法です。これにより、コンパイラが型を明確に認識できるようになります。
// 1. ConnectionCallbackを別の変数として定義する
val connectionCallback = object : MediaBrowserCompat.ConnectionCallback() {
override fun onConnected() {
// 接続が成功したときの処理
println("MediaBrowser Connected!")
}
override fun onConnectionSuspended() {
// 接続が一時停止したときの処理
println("MediaBrowser Connection Suspended")
}
override fun onConnectionFailed() {
// 接続に失敗したときの処理
println("MediaBrowser Connection Failed")
}
}
// MediaBrowserCompatのインスタンスを作成
val mediaBrowser = MediaBrowserCompat(
context, // Context
ComponentName(context, MyMediaBrowserService::class.java), // ServiceのComponentName
connectionCallback, // 2. 作成した変数を渡す
null // optional Bundle
)
// 接続を開始
mediaBrowser.connect()
<br>
2. 型を明示的に指定する
もし引数に直接記述したい場合は、object の型を明示的に指定します。ただし、コードが長くなるため、一般的には最初の方法が好まれます。
val mediaBrowser = MediaBrowserCompat(
context,
ComponentName(context, MyMediaBrowserService::class.java),
// objectに型を明示的に指定する
object : MediaBrowserCompat.ConnectionCallback() {
override fun onConnected() {
// ...
}
override fun onConnectionSuspended() {
// ...
}
override fun onConnectionFailed() {
// ...
}
},
null
)
mediaBrowser.connect()
なぜこのエラーが起きるのか?
このエラーは、Kotlinの型推論システムが、特に複雑なジェネリクスや高階関数、匿名クラスが絡み合う場面で限界に達することが原因で発生します。
今回のケースでは、connect() メソッドの引数として渡される object : MediaBrowserCompat.ConnectionCallback() { ... } の型をコンパイラが推論しようとする際に、解決できない再帰的な依存関係に陥ってしまいます。
コールバックを一度変数に定義することで、その変数の型が MediaBrowserCompat.ConnectionCallback であることがコンパイラに明確に伝わるため、型推論の問題を回避できます。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment