android - 使用 Dagger 2 对整个应用程序使用 MediaBrowserCompat 的单个实例
问题描述
我在我的应用程序的活动和片段中创建了多个 MediaBrowserCompat 实例,在这种情况下,每个组件都必须创建 MediaBrowserCompat 并将其连接到服务等等。为了更简单,使用 Dagger 只创建一个 MediaBrowserCompat 实例并将其注入到我想要的任何地方是不是一个坏主意?
像这样:
这是我创建 MediaBrowserCompat 的 MediaBrowserModule
@Module
class MediaBrowserModule {
@Provides
@Singleton
fun providesMediaBrowserCompat(
context: Context,
componentName: ComponentName,
connectionCallback: MediaBrowserConnectionCallback
): MediaBrowserCompat = MediaBrowserCompat(context, componentName, connectionCallback, null)
@Provides
fun providesMediaBrowserServiceComponentName(context: Context): ComponentName =
ComponentName(context, MediaBrowserService::class.java)
@Provides
@Singleton
fun providesMediaBrowserConnectionStatus(): MutableLiveData<MediaBrowserConnectionCallback.ConnectionStatus> =
MutableLiveData()
}
MediaBrowser 连接回调实现:
class MediaBrowserConnectionCallback @Inject constructor(private val connectionStatus: MutableLiveData<ConnectionStatus>) :
MediaBrowserCompat.ConnectionCallback() {
override fun onConnected() {
super.onConnected()
connectionStatus.postValue(ConnectionStatus.Connected)
}
override fun onConnectionSuspended() {
super.onConnectionSuspended()
connectionStatus.postValue(ConnectionStatus.Suspended)
}
override fun onConnectionFailed() {
super.onConnectionFailed()
connectionStatus.postValue(ConnectionStatus.Failed)
}
enum class ConnectionStatus {
Connected, Suspended, Failed
}
}
最后,我可以在任何地方使用它,如下所示:
class MainActivity : DaggerAppCompatActivity(), Observer<MediaBrowserConnectionCallback.ConnectionStatus> {
@Inject
lateinit var connectionState: MutableLiveData<MediaBrowserConnectionCallback.ConnectionStatus>
@Inject
lateinit var mediaBrowserCompat: MediaBrowserCompat
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
connectionState.observe(this, this)
}
override fun onStart() {
super.onStart()
if (!mediaBrowserCompat.isConnected)
mediaBrowserCompat.connect()
}
override fun onChanged(status: MediaBrowserConnectionCallback.ConnectionStatus?) {
Toast.makeText(this, status?.name, Toast.LENGTH_LONG).show()
}
}
谢谢。
解决方案
推荐阅读
- javascript - 使用 React 和 Redux 制作确认模式
- c - 我需要/可以在 C 中释放 void 指针吗?
- node.js - 动态cron参数_Node Js
- .net - NU1100:无法解析 '.NETCoreApp,Version=v3.1' 的 'Microsoft.NET.Sdk.Functions (>= 3.0.3)'
- python-3.x - 在python中使用for each循环打印出字符串中的字符数?
- c++ - 为什么 C++ 模板函数`auto`返回类型推导在 GCC 上失败,但在 Clang 和 MSVC 上有效
- php - PHP中2个日期之间的计算
- r - 创建具有多个水平的因子向量
- laravel - 在 laravel 中显示所有具有类别的产品
- r - 在 R 中使用 coord_sf 在地图轴上显示度数