Java 我能';t用匕首2将我的类注入我的视图持有者

Java 我能';t用匕首2将我的类注入我的视图持有者,java,android,dagger-2,android-viewholder,dagger,Java,Android,Dagger 2,Android Viewholder,Dagger,我制作了一个PicturedDownloader来下载图像并将其设置到我的viewHolder中。所以我想在那个viewHolder中注入PictureDownloader的一个实例,但它总是空的,我找不到注入的错误。我还要做什么?我需要另一个模块?我必须注射这个视窗支架 我带来了所有这些课程: 应用组件: @Singleton @Component(modules = {ActivityBindingModule.class, AppModule.class, PictureD

我制作了一个PicturedDownloader来下载图像并将其设置到我的viewHolder中。所以我想在那个viewHolder中注入PictureDownloader的一个实例,但它总是空的,我找不到注入的错误。我还要做什么?我需要另一个模块?我必须注射这个视窗支架

我带来了所有这些课程:

应用组件:

@Singleton
@Component(modules = {ActivityBindingModule.class,
    AppModule.class,
    PictureDownloaderModule.class,
    AndroidSupportInjectionModule.class})
public interface AppComponent extends AndroidInjector<MarvelApplication> {
    PictureDownloader getPictureDownloader();

    @Component.Builder
    interface Builder {
        @BindsInstance
        AppComponent.Builder application(Application application);
        AppComponent build();
    }
}
PicturedDownLoader:

@Singleton
public class PictureDownloader {

    private CacheImageHandler mCacheHandler;

    @Inject
    public PictureDownloader(CacheImageHandler cacheHandler) {
        this.mCacheHandler = cacheHandler;
    }

    public void download(String url, ImageView imageView) {
        if (url == null) {
            return;
        }
        if (imageView == null) {
            return;
        }

        // resetPurgeTimer();
        Bitmap bitmap = mCacheHandler.getBitmapFromCache(url);

....
CacheMageHandler:

@Singleton
public class CacheImageHandler {

    private Context mContext;
    private SoftImageCache mSoftCache;

    @Inject
    public CacheImageHandler(Context context) {
        mContext = context;
        int memClass = ( (ActivityManager) mContext.getSystemService( Context.ACTIVITY_SERVICE ) ).getMemoryClass();
        int cacheSize = 1024 * 1024 * memClass;
        mSoftCache = new SoftImageCache(cacheSize);
    }

    // Save Bitmap to CacheDir and save it on softCache
    public void saveBitmapToCache(String key, Bitmap bitmap) {
        if (bitmap != null) {

...
HomeListViewHolder:

public class HomeListViewHolder extends RecyclerView.ViewHolder {

    @Inject
    PictureDownloader mPictureDownloader;

    @BindView(R.id.image_character)
    ImageView mImageView;

    private View mItemView;
    private HomeListListener mListener;

    public HomeListViewHolder(View itemView, final HomeListListener listener) {
        super(itemView);
        ButterKnife.bind(this, itemView);
        this.mItemView = itemView;
        this.mListener = listener;
    }

    public void bindModel(final CharacterModel character) {
        mPictureDownloader.download(
            "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/shiny/",
            mImageView);

        mItemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (mListener != null) {
                    mListener.onCharacterClick(character);
                }
            }
        });
    }
我的申请:

public class MarvelApplication extends DaggerApplication {

    @Inject
    PictureDownloader mPictureDownloader;

    @Override
    protected AndroidInjector<? extends DaggerApplication> applicationInjector() {
        return DaggerAppComponent.builder().application(this).build();
    }

    public PictureDownloader getPictureDownloader(){
        return mPictureDownloader;
    }
}
公共类应用程序扩展DaggerApplication{
@注入
图片下载器MPICUTREDOWNLOADER;
@凌驾

受保护的Androidjector您的viewholder不是dagger graph的一部分,您应该通过viewholder构造函数传递donwloader引用,而不是从dagger graph的一部分实例传递

public class HomeListViewHolder extends RecyclerView.ViewHolder {

    PictureDownloader mPictureDownloader;

    @BindView(R.id.image_character)
    ImageView mImageView;

    private View mItemView;
    private HomeListListener mListener;

    public HomeListViewHolder(View itemView, final HomeListListener listener, final  PictureDownloader pictureDownloader) {
        super(itemView);
        mPictureDownloader = pictureDownloader;
        ButterKnife.bind(this, itemView);
        this.mItemView = itemView;
        this.mListener = listener;
    }
    ...
顺便说一下,您可以删除这些:

public interface AppComponent extends AndroidInjector<MarvelApplication> {
    // PictureDownloader getPictureDownloader(); <-- useless

    ...
}

@Module
public class PictureDownloaderModule {
    @Provides
    @Singleton
    CacheImageHandler providesCacheImageHandler(Context context) {
        return new CacheImageHandler(context);
    }


    // !!! Useless already added to the graph through constructor injection
    /*@Singleton
    PictureDownloader providesPictureDownloader(CacheImageHandler cacheImageHandler) {
        return new PictureDownloader(cacheImageHandler);
    }*/
}
公共接口AppComponent扩展了AndroidJector{

//PictureDownloader getPictureDownloader();您的viewholder不是dagger图的一部分,您应该通过viewholder构造函数而不是从dagger图的一部分的实例传递donwloader引用

public class HomeListViewHolder extends RecyclerView.ViewHolder {

    PictureDownloader mPictureDownloader;

    @BindView(R.id.image_character)
    ImageView mImageView;

    private View mItemView;
    private HomeListListener mListener;

    public HomeListViewHolder(View itemView, final HomeListListener listener, final  PictureDownloader pictureDownloader) {
        super(itemView);
        mPictureDownloader = pictureDownloader;
        ButterKnife.bind(this, itemView);
        this.mItemView = itemView;
        this.mListener = listener;
    }
    ...
顺便说一下,您可以删除这些:

public interface AppComponent extends AndroidInjector<MarvelApplication> {
    // PictureDownloader getPictureDownloader(); <-- useless

    ...
}

@Module
public class PictureDownloaderModule {
    @Provides
    @Singleton
    CacheImageHandler providesCacheImageHandler(Context context) {
        return new CacheImageHandler(context);
    }


    // !!! Useless already added to the graph through constructor injection
    /*@Singleton
    PictureDownloader providesPictureDownloader(CacheImageHandler cacheImageHandler) {
        return new PictureDownloader(cacheImageHandler);
    }*/
}
公共接口AppComponent扩展了AndroidJector{

//PicturedDownLoader GetPicturedDownLoader();请。您既不进行构造函数注入,也不进行字段注入,您可以删除所有的
@Inject
,而不是
MarvelApplication
中的一个。请仔细阅读并确保了解何时以及如何使用
@Inject
谢谢我已经阅读了链接,但我看到它的唯一方法是工作正在注入该类(PicturedDownLoader)进入我的片段,并将其传递到适配器的构造函数中,然后再传递到我的ViewHolder的构造函数中。还有其他方法吗?请。您既不进行构造函数注入,也不进行字段注入,您可以删除所有的
@Inject
,而不是
MarvelApplication
中的单个构造函数。请阅读carefu请仔细阅读并确保理解何时以及如何使用
@Inject
谢谢我已经阅读了链接,但我认为它将起作用的唯一方法是注入该类(PictureDownloader)进入我的片段并将其传递到我的适配器的构造函数中,然后传递到我的ViewHolder的构造函数中。还有其他方法吗?因此我必须从片段中注入PicturedDownLoader并将此对象传递到我的适配器的构造函数中,然后再传递到我的ViewHolder的构造函数中?或者还有其他方法吗?谢谢r您的帮助!是的,您通常不注入视图/视图持有者(如果您从dagger github进行搜索,则不建议这样做,尽管可以这样做或这样做),而是从控制器传递注入的依赖项(片段/活动/…)因此我必须从片段中注入PicturedDownloader,并将此对象传递到适配器的构造函数和ViewHolder的构造函数中?或者有其他方法吗?感谢您的帮助!是的,您通常不注入view/ViewHolder(如果您从dagger github进行搜索,则不建议这样做,尽管可以这样做或这样做),您可以将注入的依赖项从控制器(fragment/activity/…)传递到视图