2

私は音楽アプリケーションを開発しています。私は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; 
    } 
} 
+0

モジュールとコンポーネントを提供してください。 – Jacob

+0

@Jacobモジュールとコンポーネントを追加しました –

+0

@KienViThanhあなたはこれを解決できましたか?私は同じ問題を抱えている。 – Woppi

答えて

0

私の仮定は、あなたのArtistImageLoaderが別のクラスで定義されていることです。あなたの問題の理由は、短剣の仕方です。 injectメソッドのパラメーターとして指定したクラスに@Injectで注釈が付けられたフィールドだけを注入します。したがって@Injectと注釈されたArtistImageLoaderの中には何も注入されませんが、ArtistsFragmentの内部で定義された注釈付きフィールドのみが注入されます。

フラグメントに@Injectアノテーションを付けたLastfmServiceフィールドを定義し、インスタンスをGlide LoaderFactoryに渡すことをお勧めします。ファクトリは、それをローダのインスタンスに提供できます。これは最適なソリューションではありませんが、インスタンスに直接渡すことができないため、これは実行可能な回避策に見えます。

もう1つの方法は、カスタムApplicationの中に依存関係ツリーを構築することです。これにより、アクティビティのライフサイクルに依存することなく、どこからでも依存関係にアクセスできます。

+0

あなたの答えをありがとう。しかし、私は 'ArtistImageLoader'をGlideModuleクラスに登録し、' ArtistFragment'にインスタンスを作成して設定したいと思っています。 GlideModuleの '@Iject'アノテーションを使って' LastFmService'フィールドを定義できますか?どうすればいいですか? –

+0

ArtistImageLoaderインスタンスを別のモジュールで提供し、ArtistFragmentに挿入したいと正しく理解しましたか? – Jacob

+0

インスタンスをLoaderFactoryに渡す方法がわかりません。フラグメントにはLoaderFactoryのインスタンスがないためです。 'GlideModule'の登録メソッドで作成しました。 –

関連する問題