- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试将单例管理器添加到 Android 服务中。
问题是注入(inject)的管理器与 ViewModel 中的管理器不同。
Dagger 组件
@Singleton
@Component(modules = {ApplicationModule.class, AppScreenModule.class, ServiceModule.class})
public interface AppComponent {
void inject(App application);
void inject(OpportunisticService opportunisticService);
@Component.Builder
interface Builder {
AppComponent build();
Builder applicationModule(ApplicationModule applicationModule);
}
}
@Module
class ApplicationModule {
private final App mApp;
ApplicationModule(App app) {
mApp = app;
}
@Provides
@Named("ApplicationContext")
Context provideContext() {
return mApp.getApplicationContext();
}
@Provides
App provideApplication() {
return mApp;
}
@Provides
PeersManager providePeersManager() {
return new PeersManager();
}
}
@Module
abstract class ServiceModule {
@ContributesAndroidInjector
abstract OpportunisticService bindOpportunisticService();
}
public class Components {
private static AppComponent sComponent;
public static void initialize(App app) {
// Initialize the AppComponent
Preconditions.checkState(sComponent == null, "AppComponent already initialized");
sComponent = DaggerAppComponent.builder()
.applicationModule(new ApplicationModule(app))
.build();
}
public static AppComponent app() {
if (BuildConfig.DEBUG)
Preconditions.checkState(sComponent == null, "AppComponent not initialized");
return sComponent;
}
}
public class App extends Application implements HasActivityInjector, HasServiceInjector {
@Inject
DispatchingAndroidInjector<Activity> mActivityDispatchingAndroidInjector;
@Inject
DispatchingAndroidInjector<Service> mServiceDispatchingAndroidInjector;
@Override
public void onCreate() {
super.onCreate();
// Initialize the AppComponent
Components.initialize(this);
Components.app().inject(this);
}
@Override
public AndroidInjector<Activity> activityInjector() {
return mActivityDispatchingAndroidInjector;
}
@Override
public AndroidInjector<Service> serviceInjector() {
return mServiceDispatchingAndroidInjector;
}
}
@Singleton
public class PeersManager {
@Inject
public PeersManager() {
}
}
public class ViewModel {
private final PeersManager mPeersManager;
@Inject
public ViewModel (PeersManager peersManager) {
mPeersManager = peersManager;
}
}
public class OpportunisticService extends Service {
@Inject
PeersManager mPeersManager;
@Override
public void onCreate() {
super.onCreate();
AndroidInjection.inject(this);
}
}
ViewModel.mPeersManager
不同于
OpportunisticService.mPeersManager
,我希望它们是相同的,因为
PeersManager
被标记为单例。
AndroidInjector
不同。代表
Activity
/
Fragment
对于
Service
.
最佳答案
您已将类(class)注释为 @Singleton
作为类级别的注解,但 Dagger 忽略了该注解,支持更明确的 @Provides
bundle 。如果使用得当,这将允许您覆盖来自类本身的任何范围,因为 Dagger 假定无论类附带的“默认值”如何,您都明确列出了组件上的模块和绑定(bind)。 Dagger 看不到@Provides
里面方法本身,所以它不知道实例是来自构造函数、静态方法返回值、Module 实例字段还是其他一些更复杂的逻辑。在这里,Dagger 看到一个未作用域的 @Provides
使用未知的实现并信任您自己管理范围,而不管任何范围注释或 @Inject
构造函数注解。
因此,您可以选择以下两个选项之一:
@Singleton
在您的 @Provides PeersManager providePeersManager()
上AppModule 中的方法。这允许您在此处显式调用 PeersManager 构造函数。此时,您可以选择删除 @Singleton
PeersManager 类本身的注释,因为 Dagger 不会读取它:它显式地推迟到您的 Module 的范围配置。@Provides PeersManager
完全方法并添加 @Inject
-PeersManager 的注释构造函数。此时,Dagger 负责创建 PeersManager,因此它会观察到 @Singleton
PeersManager 类上的范围注释。@Binds
绑定(bind)到 abstract @Module
abstract @Binds PeersManager providePeersManager(DefaultPeersManager impl)
的类(class).在这种情况下,Dagger 会看到您正在将 PeersManager 重定向到 DefaultPeersManager,但 Dagger 知道如何为 DefaultPeersManager 提供其@Inject
。构造函数和 @Singleton
注解。关于android - 如何使用 Dagger 2 在 Android 服务中注入(inject)单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45399762/
我最近购买了《C 编程语言》并尝试了 Ex 1-8这是代码 #include #include #include /* * */ int main() { int nl,nt,nb;
早上好!我有一个变量“var”,可能为 0。我检查该变量是否为空,如果不是,我将该变量保存在 php session 中,然后调用另一个页面。在这个新页面中,我检查我创建的 session 是否为空,
我正在努力完成 Learn Python the Hard Way ex.25,但我无法理解某些事情。这是脚本: def break_words(stuff): """this functio
我是一名优秀的程序员,十分优秀!