「Dagger-Android&AAC」または「プッシュ非プッシュ」

画像



今日は、 Dagger 2について、特にdagger-androidAndroid Architecture Componentsについて、およびそれらを使用するときに遭遇した問題についてお話したいと思います。 おそらく、投稿は哲学的なほど認知的ではありません。投稿を作成する理由(少なくとも主観的)があるため、すぐにスリッパを投げないようにお願いします。







私はこの投稿を書く価値があるかどうか長い間考えていましたが、内部のバランスが揺らいでいました。







確かに、あなたの多くはすでにプロジェクトで上記のツールを使用しているか、少なくともこれを使ってこれがどんな獣であるかを理解しています。 だから私は最終的に、プロジェクトでそれらを使用する必要があるという結論に達しました。







これらのツールで達成したいことについて:









理解を深めるための小さなコード:







申込み
class App : DaggerApplication() { override fun applicationInjector(): AndroidInjector<out App> = DaggerAppComponent.builder().create(this) }
      
      





AppComponent
 @Singleton @Component(modules = [ (AndroidSupportInjectionModule::class), (AppModule::class), (ActivityBuilder::class) ]) interface AppComponent : AndroidInjector<App> { @Component.Builder abstract class Builder : AndroidInjector.Builder<App>() }
      
      





ActivityBuilder
 @Module abstract class ActivityBuilder { @ActivityScope @ContributesAndroidInjector(modules = [MainActivityModule::class, FragmentProvider::class, RepositoryModule::class]) abstract fun bindMainActivity(): MainActivity }
      
      





RepositoryModule
 @Module class RepositoryModule { @Provides @ActivityScope fun provideSomeDataRepository(socket: SocketService, restApi: RestApi, feedDao: FeedDao, userSettings: UserSettings): SomeDataRepository = SomeDataRepositoryImpl(socket, restApi, feedDao, userSettings)
      
      





ViewModelFactoryインジェクション
  @Inject lateinit var factory: MainViewModelFactory private lateinit var viewModel: MainViewModel viewModel = ViewModelProviders.of(this, factory) .get(MainViewModel::class.java)
      
      





ViewModelFactory
 class MainViewModelFactory @Inject constructor(private val someDataRepository: SomeDataRepository) : ViewModelProvider.Factory{ override fun <T : ViewModel?> create(modelClass: Class<T>): T { if (modelClass.isAssignableFrom(MainViewModel::class.java)) { return MainViewModelImpl(someDataRepository) as T } throw IllegalArgumentException(String.format("%s Not Found", modelClass.simpleName)) } }
      
      





ViewModel
 class MainViewModelImpl @Inject constructor(someDataRepository: SomeDataRepository) : MainViewModel(), MainViewModel.Input, MainViewModel.Output
      
      





したがって、これらすべての操作から取得したいリストについてです。







すべてが正常で、すべてが機能しますが、1つの機能に気付きました(少し後で明らかになりました)。 構成を変更した後、Daggerは依存関係を新たに作成します。 SomeDataRepositoryImplのinitブロックにブレークポイントを配置すると、同じ依存関係を持つフラグメントを追加すると、アクティビティの作成時に作成されたフラグメントに同じオブジェクトのインスタンスが転送されることがわかります(ブレークポイントは機能しませんでした)。 ただし、画面を反転すると、新しいオブジェクト(ブレークポイントが機能している)の作成を確認します。このオブジェクトは既にこのオブジェクトのインスタンスを持っているため、ビューモデルには到達しません。







これらのツールの開発経験が少ないため、他の開発者にアドバイスを求めることにしました。私は、この状況は当たり前であり、ガベージコレクターはこの混乱に対処し、すべてが正常に機能すると答えました。







「unshifted」についての投稿のタイトルを参照すると、問題のどこかで短剣によって読まれました(単語の引用の単語ではなく、意味は同じです):「あなたはこれら2つのツールのベストを組み合わせようとしています。 」







ネタバレ

もちろん、Androidの短剣を使用することはできず、AndroidViewModel(アプリケーション:Applitaction)を使用して依存関係をビューモデルに直接送信することはできませんが、視聴者はApplicationクラスを知らないため、これは機能しません。 私にとって、このクラスが存在する理由は未だに謎です。 誰かがコメントで説明できますか?







上記のすべてを要約すると、1つの質問があります。自分のやりたいことができるのでしょうか。 構成を変更するときに、この制御されていない短剣オブジェクトの作成を取り除くことは可能ですか?







ご意見をお寄せいただきありがとうございます。








All Articles