我无法使用 Dagger2 将 class 注入我的 ViewHolder
I can't Inject my class in to my ViewHolder with Dagger2
我做了一个PictureDownloader来下载图片并设置到我的viewHolder中。所以我想在该 viewHolder 中注入一个 PictureDownloader 实例,但它始终为 null,而且我找不到注入的错误。我还要做些什么?我需要另一个模块?我必须注入这个 ViewHolder?
我把这些都带来了类:
应用程序组件:
@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();
}
}
图片下载模块:
@Module
public class PictureDownloaderModule {
@Provides
@Singleton
CacheImageHandler providesCacheImageHandler(Context context) {
return new CacheImageHandler(context);
}
@Singleton
PictureDownloader providesPictureDownloader(CacheImageHandler cacheImageHandler) {
return new PictureDownloader(cacheImageHandler);
}
}
图片下载器:
@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);
....
缓存图像处理器:
@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;
}
}
您的 viewholder 不是匕首图的一部分,您应该通过 viewholder 构造函数而不是从作为匕首图一部分的实例传递一个 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);
}*/
}
我做了一个PictureDownloader来下载图片并设置到我的viewHolder中。所以我想在该 viewHolder 中注入一个 PictureDownloader 实例,但它始终为 null,而且我找不到注入的错误。我还要做些什么?我需要另一个模块?我必须注入这个 ViewHolder?
我把这些都带来了类:
应用程序组件:
@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();
}
}
图片下载模块:
@Module
public class PictureDownloaderModule {
@Provides
@Singleton
CacheImageHandler providesCacheImageHandler(Context context) {
return new CacheImageHandler(context);
}
@Singleton
PictureDownloader providesPictureDownloader(CacheImageHandler cacheImageHandler) {
return new PictureDownloader(cacheImageHandler);
}
}
图片下载器:
@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);
....
缓存图像处理器:
@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;
}
}
您的 viewholder 不是匕首图的一部分,您应该通过 viewholder 构造函数而不是从作为匕首图一部分的实例传递一个 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);
}*/
}