私は音楽アプリケーションを開発しています。私はLastFMからアーティストのイメージをロードして、このようにします。 1.私はクラスArtistImageLoader extends BaseGlideUrlLoader
を作成しました。 2. getUrl
メソッドではretrofit2を使ってlastFMからアーティストの画像URLをgetArtistInfoメソッドで取得しました。glide with dagger2の使用方法
私の問題は、修理のサービスを注入する方法を知らずに、ArtistImageLoader
にリクエストを行うことです。私はこのようにしましたが、私はNOP例外があります。 lastFmService
は注射されなかった。
// GlideModule
glide.register(MLocalArtist.class, InputStream.class, new ArtistImageLoader.Factory());
// Use it in onCreate method of ArtistsFragment
DaggerLastFmComponent.builder().activityModule(new ActivityModule(getActivity()))
.netComponent(getNetComponent())
.build().inject(this);
// use this code in onBindViewHolder method of artists recycler adapter
Glide.with(getContext())
.from(MLocalArtist.class)
.load(localArtist)
.into(localArtistViewHolder.ivArtwork);
public class ArtistImageLoader extends BaseGlideUrlLoader<MLocalArtist> {
@Inject
LastfmService lastfmService;
public ArtistImageLoader(Context context) {
super(context);
}
@Override
protected String getUrl(MLocalArtist model, int width, int height) {
Call<List<MArtist>> call = lastfmService.getArtistInfo(model.artistName);
try {
List<MArtist> artists = call.execute().body();
if (artists != null && artists.size() > 0) {
Timber.e(artists.get(0).toString());
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public static class Factory implements ModelLoaderFactory<MLocalArtist, InputStream> {
@Override public ModelLoader<MLocalArtist, InputStream> build(Context context, GenericLoaderFactory factories) {
return new ArtistImageLoader(context);
}
@Override public void teardown() {
}
}
}
ArtistImageLoaderあなたは私がそれを行うのを助けることができますか?どうもありがとうございます!
グライドバージョン:3.7.0
統合ライブラリ:OkHttp3 + Dagger2
デバイス/ Androidのバージョン:Androidのエミュレータ+ Asusのzenfone 5
EDIT 1
ActivityComponent.ja VA
@PerActivity
@Component(dependencies = AppComponent.class, modules = ActivityModule.class)
public interface ActivityComponent {
Context context();
}
AppComponent.java
@Singleton
@Component(modules = AppModule.class)
public interface AppComponent {
App app();
}
NetComponent.java
@Singleton
@Component(modules = {NetModule.class, AppModule.class})
public interface NetComponent {
@Named("chartSoundCloud")
Retrofit getSoundcloudChartRetrofit();
@Named("searchSoundCloud")
Retrofit getSoundcloudSearchRetrofit();
@Named("lastFM")
Retrofit getLastFmRetrofit();
}
LastFmComponent.java
@PerActivity
@Component(dependencies = NetComponent.class, modules = {LastFmModule.class, ActivityModule.class})
public interface LastFmComponent extends ActivityComponent {
void inject(ArtistsFragment artistsFragment);
}
ActivityModule.java
@Module
public class ActivityModule {
private final Context mContext;
public ActivityModule(Context mContext) {
this.mContext = mContext;
}
@Provides
@PerActivity
Context provideActivityContext() {
return mContext;
}
}
AppModule.java
@Module
public class AppModule {
private App app;
public AppModule(App app){
this.app = app;
}
@Singleton
@Provides
App provideApplication() {
return app;
}
@Singleton
@Provides @Named("applicationContext")
Context provideApplicationContext(){
return app;
}
}
LastFmModule.java
@Module
public class LastFmModule {
@Provides
@PerActivity
LastfmService provideLastFmService(@Named("lastFM") Retrofit retrofit) {
return retrofit.create(LastfmService.class);
}
}
NetModule.java
@Module
public class NetModule {
static final int DISK_CACHE_SIZE = (int) MEGABYTES.toBytes(50);
@Provides
@Singleton
Cache provideOkHttpCache(@Named("applicationContext") Context application) {
Cache cache = new Cache(application.getCacheDir(), DISK_CACHE_SIZE);
return cache;
}
@Provides
@Singleton
ScdClientIdInterceptor provideScdClientIdInterceptor() {
return new ScdClientIdInterceptor();
}
@Provides
@Singleton
LastFMInterceptor provideLastFmInterceptor() {
return new LastFMInterceptor();
}
@Provides
@Singleton
HttpLoggingInterceptor provideHttpLoggingInterceptor() {
return new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY);
}
@Provides
@Singleton
@Named("soundcloud-Http")
OkHttpClient provideOkHttpSoundCloudClient(Cache cache, ScdClientIdInterceptor clientIdInterceptor, HttpLoggingInterceptor httpLoggingInterceptor) {
return createOkHttpClient(cache, clientIdInterceptor, httpLoggingInterceptor);
}
@Provides
@Singleton
@Named("lastFM-Http")
OkHttpClient provideOkHttpLastFmClient(Cache cache, LastFMInterceptor clientIdInterceptor, HttpLoggingInterceptor httpLoggingInterceptor) {
return createOkHttpClient(cache, clientIdInterceptor, httpLoggingInterceptor);
}
private OkHttpClient createOkHttpClient(Cache cache, Interceptor clientIdInterceptor, HttpLoggingInterceptor httpLoggingInterceptor) {
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.cache(cache)
.addInterceptor(clientIdInterceptor)
.addInterceptor(httpLoggingInterceptor)
.connectTimeout(30, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.writeTimeout(30, TimeUnit.SECONDS)
.build();
return okHttpClient;
}
@Provides
@Singleton
Gson provideGson() {
return GsonFactory.create();
}
@Provides
@Singleton
@Named("searchSoundCloud")
Retrofit provideSearchSoundCloudRetrofit(Gson gson, @Named("soundcloud-Http") OkHttpClient okHttpClient) {
Retrofit searchRetrofit = new Retrofit.Builder()
.baseUrl(Constants.BASE_SOUNDCLOUD_API_URL)
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
return searchRetrofit;
}
@Provides
@Singleton
@Named("chartSoundCloud")
Retrofit provideChartSoundCloudRetrofit(Gson gson, @Named("soundcloud-Http") OkHttpClient okHttpClient) {
Retrofit chartRetrofit = new Retrofit.Builder()
.baseUrl(Constants.BASE_SOUNDCLOUD_API_V2_URL)
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
return chartRetrofit;
}
@Provides
@Singleton
@Named("lastFM")
Retrofit provideLastFmRetrofit(Gson gson, @Named("lastFM-Http") OkHttpClient okHttpClient) {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(Constants.LASTFM_API_URL)
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
return retrofit;
}
}
モジュールとコンポーネントを提供してください。 – Jacob
@Jacobモジュールとコンポーネントを追加しました –
@KienViThanhあなたはこれを解決できましたか?私は同じ問題を抱えている。 – Woppi