Sobes.tech
Middle

Ar esate susipažinęs su Dagger naudojimu Android programų kūrime?

sobes.tech AI

Atsakymas iš AI

Taip, pažįstu. Dagger yra priklausomybių injekcijos (Dependency Injection, DI) karkasas Java ir Android, kuris yra kompiliuojamas įkėlimo metu ir leidžia kurti optimizuotą, efektyvų ir lengvai testuojamą kodą.

Pagrindinės koncepcijos apima:

  • Moduliai (Modules): teikia priklausomybes. Pažymėti @Module. Modulio viduje metodai su @Provides aprašo, kaip sukurti konkretų priklausomybę.
    @Module
    public class AppModule {
    
        @Provides
        // teikia programos kontekstą
        Context provideAppContext(Application application) {
            return application.getApplicationContext();
        }
    
        @Provides
        // teikia SharedPreferences
        SharedPreferences provideSharedPreferences(Context context) {
            return context.getSharedPreferences("MyPrefs", Context.MODE_PRIVATE);
        }
    }
    
  • Komponentai (Components): jungia modulius ir atlieka priklausomybių injekciją. Pažymėti @Component. Komponentai yra "priklausomybių grafai".
    @Singleton
    @Component(modules = {AppModule.class})
    // programos komponentas
    public interface AppComponent {
    
        // metodas injekcijai į MainActivity
        void inject(MainActivity activity);
    
        // metodas gauti SharedPreferences iš grafo
        SharedPreferences getSharedPreferences();
    }
    
  • Injekcija (Injection): priklausomybių įvedimo procesas. Naudojama @Inject laukams ar konstruktoriams.
    public class MainActivity extends AppCompatActivity {
    
        @Inject
        // priklausomybė, kurią Dagger įdiegia
        SharedPreferences sharedPrefs;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            // Dagger generuoja kodą komponento sukūrimui ir injekcijai
            ((MyApplication) getApplication()).getAppComponent().inject(this);
    
            // dabar sharedPrefs yra prieinama
            String value = sharedPrefs.getString("key", "default");
            Log.d("MainActivity", "Reikšmė iš SharedPreferences: " + value);
        }
    }
    
  • Scope'ai (matymo srities): leidžia valdyti priklausomybių gyvavimo ciklą. @Singleton taikomas priklausomybėms su programos gyvavimo ciklu, o naudotojo sukurtos anotacijos – siauresniems sritims (pvz., @PerActivity).
    @Scope
    @Retention(RetentionPolicy.RUNTIME)
    // naudotojo sukurtas matymo srities žymeklis aktyvumo
    public @interface PerActivity {}
    

Dagger taip pat palaiko subkomponentus (@Subcomponent) kuriant mažesnius, hierarchinius priklausomybių grafus, kas naudinga moduliarioms programoms ar priklausomybėms su trumpu gyvavimo ciklu (pvz., naudotojo sesija ar konkretus ekranas).

Pagrindiniai Dagger naudojimo privalumai:

  • Našumas: kodo generavimas kompiliacijos metu sumažina vykdymo laiko išlaidas, palyginti su refleksiniais DI karkasais.
  • Patikimumas: kompiliatorius tikrina priklausomybių grafą, aptinka klaidas kūrimo metu, o ne vykdymo metu.
  • Testuojamumas: palengvina tikrų priklausomybių keitimą su mock objektais testavimui.
  • Skaitomumas ir palaikymas: aiškiai aprašo sistemos komponentų priklausomybes.