当前位置: 首页 > 知识库问答 >
问题:

在方向改变时处理匕首组件

谢正初
2023-03-14

假设这里已经说过,开发人员有责任保留组件实例以实现他们自己的作用域逻辑(因为作用域方法将为给定组件返回相同的实例)。

在整个活动生命周期中保持此组件引用的干净方法是什么?

示例:您正在实现MVP模式,因此您的活动中需要一个演示者。此演示者可以执行网络操作以下载项目。当设备旋转时,您的活动将被销毁并重新创建,但您希望继续网络操作,只需返回旋转前的演示者即可。

为演示者提供自定义PerActivity作用域的组件的作用域是解决方案,因此您必须通过此轮换保持组件实例,以便将演示者的实例注入到与第一次启动活动相同的实例中。

我们如何处理这件事?我想到了一种组件缓存(比如HashMap?)这可以由位于应用程序类内部的应用程序组件提供。

共有2个答案

潘慈
2023-03-14

网络可以与应用上下文一起工作。这是我将如何html" target="_blank">设计应用程序组件与应用程序现在我将有这个在应用程序层创建应用程序组件舒罗德将上下文作为外部依赖

接下来是在带有peractive ityVision的活动模块上扩展的活动组件...取决于应用组件

在我的每一个活动中,我会通过提供它来创建活动组件这个应用组件可以通过访问。一个ctivity.getapplication。

这里确保您的应用程序模块提供的网络方法有应用程序范围如果这种情况下,你应该得到相同的网络,甚至在应用程序罗拉。

LookforGithubApplication示例将在下一次编辑中发布链接。

他也值得看看livedata(这个问题断章取义)

彭存
2023-03-14

您可以看到ribot/android样板展示应用程序的实现。他们选择的解决方案是使用静态映射

public class BaseActivity extends AppCompatActivity {

    private static final AtomicLong NEXT_ID = new AtomicLong(0);
    private static final Map<Long, ConfigPersistentComponent> sComponentsMap = new HashMap<>();

    private ActivityComponent mActivityComponent;
    private long mActivityId;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Create the ActivityComponent and reuses cached ConfigPersistentComponent if this is
        // being called after a configuration change.
        mActivityId = savedInstanceState != null ?
                savedInstanceState.getLong(KEY_ACTIVITY_ID) : NEXT_ID.getAndIncrement();

        ConfigPersistentComponent configPersistentComponent;
        if (!sComponentsMap.containsKey(mActivityId)) {
            // Creating new component
            configPersistentComponent = DaggerConfigPersistentComponent.builder()
                    .applicationComponent(BoilerplateApplication.get(this).getComponent())
                    .build();
            sComponentsMap.put(mActivityId, configPersistentComponent);
        } else {
            // Reusing component
            configPersistentComponent = sComponentsMap.get(mActivityId);
        }
        mActivityComponent = configPersistentComponent.activityComponent(new ActivityModule(this));
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putLong(KEY_ACTIVITY_ID, mActivityId);
    }

    @Override
    protected void onDestroy() {
        if (!isChangingConfigurations()) {
            // Activity is finishing, removing the component
            sComponentsMap.remove(mActivityId);
        }
        super.onDestroy();
    }

    ...

}

 类似资料:
  • 我正在为使用Dagger的项目设置Maven,但我找不到关于Maven处理器插件的注释处理设置的好指南 这是我的pom的一部分。xml 但它不能构建最后一个模块,该模块引用注入的属性。目标/生成的源/批注为空。我的IDE-InteliJ想法 对不起,关于noob的问题,我完全糊涂了。我很乐意接受任何建议。

  • 我如何在配置更改时保留这个列表?我已经寻找了许多解决方案,但许多人建议在manifest中使用'Android:ConfigChanges',我完全反对使用。许多人建议,我也读到过--在Fragment中使用setRetaInstance(true)来保留这个片段。 我尝试实现它,但我失败了。许多教程在方向改变后使用findFragmentByTag检查片段,但在我的情况下,它总是返回null。有

  • 我找到了静态编程语言Lazy对象的答案,在这里使用:静态编程语言:检查Lazy val是否已初始化 但看起来像匕首。Lazy没有相同的公共方法。 这就是我如何懒洋洋地使用Dagger注射: 如何在不调用someService的情况下检查someService是否已初始化。get()哪个将初始化它?除了引入布尔标志并自己跟踪它之外。。 谢谢

  • 承认,匕首是强硬的,我正试图注射改型。我注入了Context和SharedPreferences,它工作得很好,但改型破坏了这一切。它可以识别DaggerRetrofitComponent类,但不能找到DaggerAppComponent。

  • 基于本教程使用Dagger Hilt添加子组件需要 这就是如何创建子组件 我的问题是如何实现 因为它没有显示它是如何提供给UserManager类的 我正在尝试创建一个AppComponent来测试子组件如何与Dagger Hilt一起工作 并在应用中 我应该如何在中创建构建器,创建实现Provider的匿名类不正确吗?

  • 我在应用程序中有多个匕首瞄准镜 UserScope-范围表示用户会话 ActivityScope-每个活动的范围 UserComponent-CoreComponent的子组件 UserManager-创建UserComponent的单例程序 HomeComponent-依赖于UserComponent的组件 我试图在下更新用户对象,但不知何故,对象更新没有反映在它的依赖组件上。因此,一旦更新屏幕