java – Dagger 2:使用@Named获取同一对象的多个实例时出错
发布时间:2020-12-15 04:36:12 所属栏目:Java 来源:网络整理
导读:我怎么能得到像光标一样的多个相同返回类型的实例 例如 :- Module@CursorScopepublic class CursorModule { @Provides Cursor provideSongCursor( @Named("Song") Musician musician) { return musician.getApplicationContext().getContentResolver().quer
我怎么能得到像光标一样的多个相同返回类型的实例
例如 :- Module @CursorScope public class CursorModule { @Provides Cursor provideSongCursor( @Named("Song") Musician musician) { return musician.getApplicationContext().getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,new String[]{ BaseColumns._ID,MediaStore.Audio.AudioColumns.TITLE,MediaStore.Audio.AudioColumns.ARTIST,MediaStore.Audio.AudioColumns.ALBUM,MediaStore.Audio.AudioColumns.DURATION },MediaStore.Audio.AudioColumns.IS_MUSIC + "=1",null,null); } @Provides Cursor provideAlbumCursor( @Named("Album") Musician musician) { return musician.getApplicationContext().getContentResolver().query(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,MediaStore.Audio.AlbumColumns.ALBUM,MediaStore.Audio.AlbumColumns.ARTIST,MediaStore.Audio.AlbumColumns.NUMBER_OF_SONGS,MediaStore.Audio.AlbumColumns.FIRST_YEAR },null); } @Provides Cursor provideArtistCursor(@Named("Artist") Musician musician) { return musician.getApplicationContext().getContentResolver().query(MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI,new String[] { BaseColumns._ID,MediaStore.Audio.ArtistColumns.ARTIST,MediaStore.Audio.ArtistColumns.NUMBER_OF_ALBUMS,MediaStore.Audio.ArtistColumns.NUMBER_OF_TRACKS },null); } @Provides Cursor provideGenreCursor( @Named("Genres") Musician musician) { return musician.getApplicationContext().getContentResolver().query(MediaStore.Audio.Genres.EXTERNAL_CONTENT_URI,MediaStore.Audio.GenresColumns.NAME },null); } @Provides Cursor providePlaylistCursor(@Named("Playlist") Musician musician) { return musician.getApplicationContext().getContentResolver().query(MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI,MediaStore.Audio.PlaylistsColumns.NAME },null); } } 提供的 @CursorScope @Subcomponent(modules = CursorModule.class) public interface CursorComponent { Cursor cursor(); } 我收到这个错误 Error:(17,11) Gradle: error: android.database.Cursor is bound multiple times: @Provides android.database.Cursor com.merkmod.musician.dependency.CursorModule.provideSongCursor(@Named("Song") com.merkmod.musician.application.Musician) @Provides android.database.Cursor com.merkmod.musician.dependency.CursorModule.provideAlbumCursor(@Named("Album") com.merkmod.musician.application.Musician) @Provides android.database.Cursor com.merkmod.musician.dependency.CursorModule.provideArtistCursor(@Named("Artist") com.merkmod.musician.application.Musician) @Provides android.database.Cursor com.merkmod.musician.dependency.CursorModule.provideGenreCursor(@Named("Genres") com.merkmod.musician.application.Musician) @Provides android.database.Cursor com.merkmod.musician.dependency.CursorModule.providePlaylistCursor(@Named("Playlist") com.merkmod.musician.application.Musician) 我创建了多个Cursor实例,并在提供程序级别使用@Named进行注释,然后它开始给我错误,无法提供@Provides注释,所以我转而在构造函数中使用它 就像上面的代码一样.问题是一次又一次地运行一个循环,我就像陷入完成光标的工作一样,任何帮助都会得到应用. 解决方法
当你想提供一种类型的多个变量时,你必须使用如下所示的@Named注释:
Module @CursorScope public class CursorModule { @Provides @Named("songCursor") Cursor provideSongCursor( @Named("Song") Musician musician) { return musician.getApplicationContext().getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,new String[]{ BaseColumns._ID,MediaStore.Audio.AudioColumns.DURATION },null); } @Provides @Named("albumCursor") Cursor provideAlbumCursor( @Named("Album") Musician musician) { return musician.getApplicationContext().getContentResolver().query(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,MediaStore.Audio.AlbumColumns.FIRST_YEAR },null); } @Provides @Named("artistCursor") Cursor provideArtistCursor(@Named("Artist") Musician musician) { return musician.getApplicationContext().getContentResolver().query(MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI,new String[] { BaseColumns._ID,MediaStore.Audio.ArtistColumns.NUMBER_OF_TRACKS },null); } @Provides @Named("genreCursor") Cursor provideGenreCursor( @Named("Genres") Musician musician) { return musician.getApplicationContext().getContentResolver().query(MediaStore.Audio.Genres.EXTERNAL_CONTENT_URI,MediaStore.Audio.GenresColumns.NAME },null); } @Provides @Named("playListCursor") Cursor providePlaylistCursor(@Named("Playlist") Musician musician) { return musician.getApplicationContext().getContentResolver().query(MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI,MediaStore.Audio.PlaylistsColumns.NAME },null); } } 那么当你想要像下面这样注入时: @Inject @Named("soundCursor") Cursor soundCursor; @Inject @Named("albumCursor") Cursor albumCursor; @Inject @Named("artistCursor") Cursor artistCursor; @Inject @Named("genreCursor") Cursor genreCursor; @Inject @Named("playListCursor") Cursor playListCursor; 如果你想在构造函数注射中注射它们,请执行以下操作: @Inject public SomeClassConstructor(@Named("album") Cursor cursur) 以及你在你的子组件界面中写的东西我不能得到它是什么,它必须像: @CursorScope @Subcomponent(modules = CursorModule.class) public interface CursorComponent { void inject(TheClassThatWantsToUseInject1 obj); void inject(TheClassThatWantsToUseInject2 obj); } 在您的应用程序组件中: YourSubComponentInterface plus(CursorModule module); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |