相关疑难解决方法(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万
查看次数

Dagger2活动范围,我需要多少个模块/组件?

我有几个关于自定义范围的问题:

  1. 我正在使用MVP架构,我需要为不同的活动注入不同的演示者.为此我创建了@ActivityScope.这是否意味着我必须为每个活动创建一个单独的模块/组件?
  2. 如果我仍然负责创建和释放这些依赖项,那么自定义范围注释的目的是什么?不确定我是否正确,但我可以在我的所有模块/组件中使用@ Scope123,它不会有任何区别.

android dagger-2

5
推荐指数
1
解决办法
1511
查看次数

使用 Dagger 2 for Android MVP 设置模块和组件 - 具有多个片段的活动

我已经使用 Dagger 2 一段时间了,但我仍在尝试解决一些问题。我仍然管理得不好的一件事是为不同情况设置模块和组件,例如具有多个片段的活动。我见过很多实现,大多数时候都有点不同。

那么,让我公开一下我当前使用 MVP 的应用程序结构,如果我的实现是否正确,我想听听一些意见。

@Module
public final class ApplicationModule {

private Context mContext;


public ApplicationModule(Context context){
    mContext = context;
}


public ApplicationModule(){
    mContext = null;
}

@Provides
Context provideContext(){
    return mContext;
}

@Singleton
@Provides
public SharedPreferences getAppPreferences(){
    return mContext.getSharedPreferences("CalorieApp",Context.MODE_PRIVATE);
 }
}

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

void inject(MainApplication mainApplication);

SharedPreferences sharedPreferences();

}
Run Code Online (Sandbox Code Playgroud)

在此 AppModule 中,我通常只会设置我的应用程序需要的 Singleton。就像 SharedPreferences 或与网络请求相关的任何内容。这个模块和组件在某种程度上是标准的,我总是通过这样创建它们来启动我的应用程序。

然后我为 Activity 设置模块和组件,它将依赖于 ApplicationComponent

@Module
public class ActivityModule {

private Activity activity;

public ActivityModule(Activity activity){
    this.activity …
Run Code Online (Sandbox Code Playgroud)

mvp android dagger dagger-2

5
推荐指数
1
解决办法
1149
查看次数

标签 统计

dagger-2 ×3

android ×2

dagger ×1

java ×1

lifecycle ×1

mvp ×1