请求Dagger重新注入施工后?

时间:2014-04-20 03:26:14

标签: android dagger

我有一个Activity,它执行初始注入以获取一些值。然后它(使用Otto当然)订阅来自IntentService的更改(它与我的后端服务器进行简单同步)。在此之后,它开始用数据库中的值进行一些处理,它最初没有(即在构造时)。

我本来想做的就是问Dagger,做一次"重新注射"对于模块,由于外部环境的原因,更新了信息。

我目前正在注入父模块类,然后再次手动调用provide方法,以获取最新信息。

这是我的模块的样子

@Module(
    injects = { MyActivity.class}
)
public class SessionModule {

    private Event _currentEvent;

    @Provides
    @Singleton
    SessionModule provideSessionModule() {
        return this;
    }

    @Provides
    @Singleton
    @Named("current")
    public Event provideCurrentEvent() {

        if (_currentEvent == null) {
            _currentEvent = getCurrentEvent_fromStoredPreferencesId();
        }

        if (_currentEvent == null) {
            _currentEvent = getCurrentEvent_fromFirstEventInDatabase();
        }

        return _currentEvent;
    }

    private Event getCurrentEvent_fromStoredPreferencesId() {
        return Event.findEventById(SharedPrefs.getIntPref(KEY_CURRENT_EVENT_ID));
    }

    private Event getCurrentEvent_fromFirstEventInDatabase() {
        List<Event> events = Event.getAll();

        if (events.isEmpty()) {
            return null;
        }

        Event firstEvent = events.get(0);
        PkkSharedPreferencesHelper.setIntPref(KEY_CURRENT_EVENT_ID, firstEvent.getId());
        return firstEvent;
    }

    public void clearAllSessionInformation() {
        _currentEvent = null;
        _currentUser = null;
    }
}

现在,在我的活动中,这就是:

public class MyActivity
    extends BaseActivity {

    @Inject @Named("current") Event _currentEvent;
    @Inject SessionModule _session;

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

        // ...
        MyApp.get(this).inject(this);
        getBus().register(this);
        // ...

        // _currentEvent is null, because SharedPrefs & Db both don't have any info yet.

        startAnIntentService_ForSyncingLatestData();
    }

    // ...

    @Subscribe
    public void onSyncFinished(SyncIntentService.SyncFinishedEvent syncFinishedEvent) {

        assert(_currentEvent == null);  // arr.. _currentEvent is null

        // because the database populated some events only "after" the sync
        // and didn't have anything when Dagger did the initial bootstrap/injection.

        // manually get the event from the @Module
        _currentEvent = _session.provideCurrentEvent();

        assert(_currentEvent != null);
    }
}

这有效,但是:

  • 是否有一些方法,我可以做到&#34;启动&#34;重新注入?
  • 我是否从根本上错误地使用Dagger或者这种用法,公平游戏?
  • 如果这是一个不正确的策略,那么处理这个特定情况会有更好的策略吗?

1 个答案:

答案 0 :(得分:3)

考希克,

您可以通过直接与对象图对话并传入您要求的类来使用构造函数注入,在本例中为Event。

虽然这是重新注入对象的一种方法,但我不认为这是Dagger的一个很好的用例,你最好在运行时构建该类。除非在这种情况下有充分的理由使用Dagger?

克里斯