相关疑难解决方法(0)

什么决定了Dagger 2中组件(对象图)的生命周期?

我试图围绕Dagger 2中的范围,特别是范围图的生命周期.如何创建一个在离开示波器时将被清理的组件.

对于Android应用程序,使用Dagger 1.x,您通常在应用程序级别具有根范围,您可以扩展该范围以在活动级别创建子范围.

public class MyActivity {

    private ObjectGraph mGraph;

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

    public void onDestroy() {
        mGraph = null;
    }
}
Run Code Online (Sandbox Code Playgroud)

只要您保留对它的引用,子范围就存在,在这种情况下,它是您的Activity的生命周期.删除onDestroy中的引用可确保范围图可以自由地进行垃圾回收.

编辑

杰西威尔逊最近发布了一个mea culpa

Dagger 1.0严重搞砸了它的范围名称...... @Singleton注释用于根图和自定义图形,因此弄清楚事物的实际范围是很棘手的.

我读过/听过的其他一切都指向Dagger 2改进了范围的工作方式,但我很难理解其中的差异.根据@Kirill Boyarshinov在下面的评论,组件或依赖关系的生命周期仍然像往常一样通过具体的引用来确定.那么Dagger 1.x和2.0范围之间的差异纯粹是语义清晰度的问题吗?

我的理解

匕首1.x

依赖性是否是@Singleton.根图和子图中的依赖性同样如此,导致依赖关系绑定到哪个图形的模糊性(参见In Dagger是缓存的子图中的单例,或者当新的活动子图时它们总是被重新创建)是构造?)

匕首2.0

自定义范围允许您创建语义清晰的范围,但在功能上等同于@Singleton在Dagger 1.x中应用.

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

@Module
public class MyAppModule { …
Run Code Online (Sandbox Code Playgroud)

java lifecycle dagger-2

126
推荐指数
1
解决办法
2万
查看次数

Dagger 2错误:依赖"无法在没有@Inject构造函数的情况下提供",而它实际上是用@Inject注释的

我开始使用Dagger 2并遇到一个奇怪的问题,看起来像是一个bug.

我有3个模块,它们组成一个子组件,后者又扩展/加载更高级别的组件.

子组件非常简单:只需组合模块和单个注入点:

@Singleton
@Subcomponent(
        modules = {
                NavigationDrawerModule.class,
                NavigationListModule.class,
                SwitcherModule.class
        }
)
public interface NavigationDrawerComponent {


    NavigationDrawerFragment inject(NavigationDrawerFragment object);

}
Run Code Online (Sandbox Code Playgroud)

第一个模块看起来像这样 - 它提供了一般的片段级依赖关系:

@Module
public class NavigationDrawerModule {

    private final Activity activity;
    private final View rootView;
    private final LoaderManager loaderManager;

    public NavigationDrawerModule(Activity activity, View rootView, LoaderManager loaderManager) {
        this.activity = activity;
        this.rootView = rootView;
        this.loaderManager = loaderManager;
    }

    @Provides @Singleton EventBus provideLocalBus() {
        return EventBus.builder().build();
    }

    @Provides @Singleton View provideViewRoot() {
        return rootView;
    }

    @Provides @Singleton LoaderManager provideLoaderManager() …
Run Code Online (Sandbox Code Playgroud)

android dagger dagger-2

44
推荐指数
4
解决办法
6万
查看次数

没有@Annex-annotated方法就无法提供上下文,但它是?

我有以下简单的模块:

@Module
public class ApplicationModule {

    private CustomApplication customApplication;

    public ApplicationModule(CustomApplication customApplication) {
        this.customApplication = customApplication;
    }

    @Provides @Singleton CustomApplication provideCustomApplication() {
        return this.customApplication;
    }

    @Provides @Singleton @ForApplication Context provideApplicationContext() {
        return this.customApplication;
    }

}
Run Code Online (Sandbox Code Playgroud)

以及各自的简单组件:

@Singleton
@Component(
        modules = ApplicationModule.class
)
public interface ApplicationComponent {

    CustomApplication getCustomApplication();

    Context getApplicationContext();

}
Run Code Online (Sandbox Code Playgroud)

我在这里创建组件:

public class CustomApplication extends Application {

    ...

    private ApplicationComponent component;

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }

    @Override
    public void onCreate() {
        super.onCreate();

        component = DaggerApplicationComponent.builder() …
Run Code Online (Sandbox Code Playgroud)

android dagger dagger-2

13
推荐指数
1
解决办法
1万
查看次数

标签 统计

dagger-2 ×3

android ×2

dagger ×2

java ×1

lifecycle ×1