SORU
9 ŞUBAT 2015, PAZARTESİ


Hançer 2 bileşeni (nesne grafiği) ömrü ne belirler?

2, kapsamlı grafikler ömrü özellikle Hançer bulur kafamda bir yere oturtmaya çalışıyorum. Nasıl kapsam çıkarken temizlenecek bir bileşen oluşturun.

Bir Android uygulaması, Hançer kullanma 1 durumunda.x genellikle uzatmak istiyorum hangi uygulama düzeyinde bir kök kapsamında faaliyet düzeyinde bir alt kapsam oluşturmak zorunda.

public class MyActivity {

    private ObjectGraph mGraph;

    public void onCreate() {
        mGraph = ((MyApp) getApplicationContext())
            .getObjectGraph()
            .plus(new ActivityModule())
            .inject(this);
    }

    public void onDestroy() {
        mGraph = null;
    }
}

Alt kapsamı bu durumda Etkinliği ömrü olan bir başvuru tuttuğun sürece var. OnDestroy başvuru bırakarak kapsamlı grafik çöplük özgürdü sağlamıştır.

EDİT

Jesse Wilson Son mea culpa a gönderildi

Hançer 1.0 çok kötü kapsam adları berbat ... @Singleton açıklama kök grafikler ve özel grafikler her ikisi için de kullanılır, zor bir şey gerçek kapsamının ne olduğunu anlamak hiç de zor değil.

ve Hançer 2 şekilde geliştirme yolunda/haber puan kapsamları okudum her şey çalışmak, ama aradaki farkı anlamakta güçlük çekiyorum. @Kirill Boyarshinov aşağıda Yorum yok göre, bir bileşen ya da bağımlılık döngüsü hala, her zamanki gibi, somut kaynaklar tarafından belirlenir. Yani Hançer 1 arasındaki fark.x ve 2.0 kapsamları tamamen anlamsal açıklık meselesi?

Benim anlayış

Hançeri 1.x

Bağımlılıklar @Singleton ya yok edildi ya. Bu kök grafik ve subgraphs bu bağımlılıkları eşit derecede gerçek, bağımlılık bağlı olarak belirsizlik (In Dagger are Singletons within the sub-graph cached or will they always be recreated when a new activity sub-graph is constructed?) önde girdi

Hançer 2.0

Özel kapsamları anlamsal kapsamları net oluşturmak için izin, ama işlevsel @Singleton uygulayarak eşdeğer Hançeri 1.x.

// Application level
@Singleton
@Component( modules = MyAppModule.class )
public interface MyAppComponent {
    void inject(Application app);
}

@Module
public class MyAppModule {

    @Singleton @Named("SingletonScope") @Provides
    Application provideStringBuilderSingletonScope() {
        return new StringBuilder("App");
    }
}

// Our custom scope
@Scope public @interface PerActivity {}

// Activity level
@PerActivty
@Component(
    dependencies = MyAppComponent.class,
    modules = MyActivityModule.class
)
public interface MyActivityComponent {
    void inject(Activity activity);
}

@Module
public class MyActivityModule {

    @PerActivity @Named("ActivityScope") @Provides
    StringBuilder provideStringBuilderActivityScope() {
        return new StringBuilder("Activity");
    }

    @Name("Unscoped") @Provides
    StringBuilder provideStringBuilderUnscoped() {
        return new StringBuilder("Unscoped");
    }
}

// Finally, a sample Activity which gets injected
public class MyActivity {

    private MyActivityComponent component;

    @Inject @Named("AppScope")
    StringBuilder appScope

    @Inject @Named("ActivityScope")
    StringBuilder activityScope1

    @Inject @Named("ActivityScope")
    StringBuilder activityScope2

    @Inject @Named("Unscoped")
    StringBuilder unscoped1

    @Inject @Named("Unscoped")
    StringBuilder unscoped2

    public void onCreate() {
        component = Dagger_MyActivityComponent.builder()
            .myApplicationComponent(App.getComponent())
            .build()
            .inject(this);

        appScope.append(" > Activity")
        appScope.build() // output matches "App (> Activity) " 

        activityScope1.append("123")
        activityScope1.build() // output: "Activity123"

        activityScope2.append("456")
        activityScope1.build() // output: "Activity123456"

        unscoped1.append("123")
        unscoped1.build() // output: "Unscoped123"

        unscoped2.append("456")
        unscoped2.build() // output: "Unscoped456"

    }

    public void onDestroy() {
        component = null;
    }

}

Paket @PerActivity kullanarak iletişim kurarniyetibu bileşen ömrü ile ilgili olabilir, ama sonuçta bileşeni her yerde/her zaman kullanabilirsiniz. Hançerin tek söz, verilen bir bileşen için, kapsam açıklamalı yöntemleri tek bir örneğini döndürür. Ben de bu bileşen kapsamında ek açıklama modülleri tek ya da aynı kapsamda ya da olmayan kapsamlı bağımlılıkları sağlamak doğrulamak için kullanır Hançer 2 varsayalım.

Özet Olarak

Bağımlılıkları hala tek ya da non-singleton ama @Singleton şimdi uygulama düzeyinde tek örneği ve özel kapsamları daha kısa bir yaşam döngüsü ile tek bağımlılıkları notlar için tercih edilen yöntem için tasarlanmıştır.

Geliştirici sorumlu yönetici yaşam döngüsü bileşenleri/bağımlılıklar tarafından atılan başvurular artık gerekli ve sorumlu sağlanması bileşenleri, sadece oluşturulan bir kere kapsam için hangi onlar tasarlanmış, ama özel kapsam açıklamalar yapmak daha kolay tanımlamak için bu kapsam.

$64 K Soru*

Hançer 2 kapsamları ve ömürleri benim anlayış doğru mu?

* Aslında $64'000 soru.

CEVAP
26 AĞUSTOS 2015, ÇARŞAMBA


Sorunuza gelince

Hançer 2 bileşeni (nesne grafiği) ömrü ne belirler?

Kısa cevapbunu belirlemek. Bileşenleri bir kapsam olarak verilebilir

@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface ApplicationScope {
}

@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface ActivityScope {
}

Bu iki şey için sizin için yararlıdır:

  • Kapsam geçerliliği: bir bileşen sadece unscoped sağlayıcıları olabilir, ya da bileşen olarak aynı kapsam sağlayıcıları kapsamlı.

.

@Component(modules={ApplicationModule.class})
@ApplicationScope
public class ApplicationComponent {
    Something something();
    AnotherThing anotherThing();

    void inject(Whatever whatever);
}

@Module
public class ApplicationModule {
    @ApplicationScope //application-scoped provider, only one can exist per component
    @Provides
    public Something something() {
         return new Something();
    }

    @Provides //unscoped, each INJECT call creates a new instance
    public AnotherThing anotherThing() {
        return new AnotherThing();
    }
}
  • Alt kapsamı kapsamlı kendi bağımlılıkları için, böylece bir "" "" bileşeni. superscoped sağlanan örneklerini kullanan bir bileşen subscoped oluşturmak için izin verir

Bu @Subcomponent açıklama, bileşeni ya da bağımlılıkları ile yapılabilir. Ben şahsen bağımlılıkları tercih ederim.

@Component(modules={ApplicationModule.class})
@ApplicationScope
public class ApplicationComponent {
    Something something();
    AnotherThing anotherThing();

    void inject(Whatever whatever);

    ActivityComponent newActivityComponent(ActivityModule activityModule); //subcomponent factory method
}

@Subcomponent(modules={ActivityModule.class})
@ActivityScope
public interface ActivityComponent {
    ThirdThingy thirdThingy();

    void inject(SomeActivity someActivity);
}

@Module
public class ActivityModule {
    private Activity activity;

    public ActivityModule(Activity activity) {
        this.activity = activity;
    }

    //...
}

ApplicationComponent applicationComponent = DaggerApplicationComponent.create();
ActivityComponent activityComponent = applicationComponent.newActivityComponent(new ActivityModule(SomeActivity.this));

Veya bileşen bağımlılıklar gibi kullanabilirsiniz

@Component(modules={ApplicationModule.class})
@ApplicationScope
public class ApplicationComponent {
    Something something(); 
    AnotherThing anotherThing();

    void inject(Whatever whatever);
}

@Component(dependencies={ApplicationComponent.class}, modules={ActivityModule.class})
@ActivityScope
public interface ActivityComponent extends ApplicationComponent {
    ThirdThingy thirdThingy();

    void inject(SomeActivity someActivity);
}

@Module
public class ActivityModule {
    private Activity activity;

    public ActivityModule(Activity activity) {
        this.activity = activity;
    }

    //...
}

ApplicationComponent applicationComponent = DaggerApplicationComponent.create();
ActivityComponent activityComponent = DaggerActivityComponent.builder().activityModule(new ActivityModule(SomeActivity.this)).build();

Önemli şeyleri bilmek:

  • Kapsamlı bir sağlayıcı belirli bir kapsam için bir örnek oluştururher bileşen için. Bir bileşen anlamı kendi örneklerini takip eder, ama diğer bileşenler paylaşılan kapsamında bir havuz ya da biraz sihir yok. Belirli bir kapsam içinde bir örnek olması için, bu bileşenin bir örneğini gerekir. Bu kendi kapsamlı bağımlılıklarından erişmek için ApplicationComponent sağlamanız gerekiyor.

  • Bir bileşen sadece tek bir kapsamlı bileşen subscope. Çok kapsamlı bileşen bağımlılıklar (eğer hepsi ben biraz olsa da farklı kapsamları varsa bile bir hata olduğunu düşünüyorum) izin verilmez.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Adam Khoury

    Adam Khoury

    23 Ocak 2008
  • funbro1

    funbro1

    11 Aralık 2007
  • Rickymon Tero

    Rickymon Ter

    1 Ocak 2007