Startup tasks run after Brix.get().init(config) and before presenters activate. Extend BrixStartupTask, implement run(), and call complete() when finished.
public class FetchConfigTask extends BrixStartupTask {
@Override
public int order() { return 0; }
@Override
public void run() {
fetchRemoteConfig(config -> {
Brix.get().config().put("apiBase", config.apiBase());
complete();
});
}
}
onComplete callback passed to start(...) fires.Bind tasks with the @BrixTask qualifier so you can inject the set into your entry point.
@Module
public class AppTasksModule {
@Provides
@BrixTask
static List<BrixStartupTask> tasks(FetchConfigTask fetchConfig,
WarmupTask warmup) {
return List.of(fetchConfig, warmup);
}
}
public class AppEntryPoint {
@Inject @BrixTask Set<BrixStartupTask> startupTasks;
public void onModuleLoad() {
DaggerAppComponent.create().inject(this);
Brix.get().init(Map.of("env", "prod"));
Brix.get().start(startupTasks, () -> DomGlobal.console.info("App started"));
}
}
Annotate tasks with @AutoService(BrixStartupTask.class) to generate a BrixStartupTask_ServiceLoader helper. This lets you start Brix without wiring DI modules.
@AutoService(BrixStartupTask.class)
public class FetchConfigTask extends BrixStartupTask { /* ... */ }
List<BrixStartupTask> tasks = BrixStartupTask_ServiceLoader.load();
Brix.get().init(Map.of());
Brix.get().start(new LinkedHashSet<>(tasks), () -> DomGlobal.console.info("App started"));
complete() even for synchronous work.order() values for tasks that depend on earlier ones.getContextWait() if you need to coordinate multiple async operations inside one task.