加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读