img*_*gen 5 java android dagger
我在Android上玩Dagger.我创建了一个模型UserPreference
,一个调用的模块PreferenceModule
和另一个类UserPreferenceTest
的测试PreferenceModule
.我有3个以下的java文件
UserPreference.java
package com.sigicn.preference;
import javax.inject.Inject;
import com.sigicn.commonmodels.Application;
public class UserPreference {
public String name, weiboAccount;
@Inject
public Application[] frequentlyUsedApps;
}
Run Code Online (Sandbox Code Playgroud)
然后是PreferenceModule.java
package com.sigicn.preference;
import javax.inject.Singleton;
import com.sigicn.commonmodels.Application;
import com.sigicn.utils.MiscUtils;
import dagger.Module;
import dagger.Provides;
@Module(library = true, complete = true)
public class PreferenceModule {
@Provides @Singleton UserPreference provideUserPreference() {
UserPreference userPreference = new UserPreference();
userPreference.frequentlyUsedApps = provideApplications();
return userPreference;
}
@Provides @Singleton Application[] provideApplications() {
return new Application[]{
new Application(
MiscUtils.generateUUID(), "Youtube"),
new Application(
MiscUtils.generateUUID(), "Pixi")
};
}
}
Run Code Online (Sandbox Code Playgroud)
然后是UserPreferenceTest.java
package com.sigicn.test.preference;
import javax.inject.Inject;
import com.sigicn.preference.PreferenceModule;
import com.sigicn.preference.UserPreference;
import dagger.Module;
import dagger.ObjectGraph;
import android.test.AndroidTestCase;
public class UserPreferenceTest extends AndroidTestCase {
@Module(injects = {UserPreference.class, UserPreferenceTest.class},
includes = PreferenceModule.class)
static class TestModule {
}
ObjectGraph objectGraph;
@Inject
UserPreference userPreference;
@Override
protected void setUp() throws Exception {
if (objectGraph == null) {
objectGraph = ObjectGraph.create(new TestModule());
}
super.setUp();
}
public void testFrequentlyUsedApps()
{
UserPreference localUserPreference = objectGraph.get(UserPreference.class);
assertNotNull(localUserPreference);
assertEquals(localUserPreference.frequentlyUsedApps.length, 2);
objectGraph.inject(this);
assertNotNull(userPreference);
assertEquals(userPreference.frequentlyUsedApps.length, 2);
assertSame(localUserPreference, userPreference);
assertSame(localUserPreference.frequentlyUsedApps, userPreference.frequentlyUsedApps);
}
}
Run Code Online (Sandbox Code Playgroud)
但是不知道为什么,那frequentlyUsedApps
的UserPreference
并不如预期注入.知道为什么吗?
更新:
我想我已经找到了原因.这是因为我手动创建UserPreference
并在提供程序中使用它.如果我删除了Provider UserPreference
,并让Dagger自动连接,那么该字段frequentlyUsedApps
会被注入.因此,我不能很好地理解Dagger.
我想你需要添加一些ObjectGraph#inject调用.
在每个具有@Inject批注的类中,您还需要调用您创建的ObjectGraph的inject方法.
我也一直在努力解决这个问题.我认为基本模式是:
我开始使用单例而不是Application类,因为至少现在我有一些地方我想要注入应用程序本身.
所以这就是我目前正在做的事情,这似乎很有效
public class Injector {
private static Injector mInjector;
private ObjectGraph mObjectGraph;
private MyApp mApp;
private Injector() {
}
public static Injector getInstance() {
if (mInjector == null) {
mInjector = new Injector();
}
return mInjector;
}
protected List<Object> getModules() {
return Arrays.asList(
new ApplicationModule(mApp),
new AndroidModule(mApp)
);
}
public void inject(Object object) {
getObjectGraph().inject(object);
}
public ObjectGraph getObjectGraph() {
return mObjectGraph;
}
public void initialize(MyApp app) {
mApp = app;
mObjectGraph = ObjectGraph.create(getModules().toArray());
System.out.println(String.format("init object graph = %s",mObjectGraph.toString()));
}
}
Run Code Online (Sandbox Code Playgroud)
然后在我的应用程序类中,我有一个像这样的构造函数:
public MyApp() {
System.out.println("myapp construtor");
Injector.getInstance().initialize(this);
Injector.getInstance().inject(this);
}
Run Code Online (Sandbox Code Playgroud)
然后,当我想注入一些东西时,我会这样做
@Inject Bus mBus;
public GcmBroadcastReceiver() {
Injector.getInstance().inject(this);
}
Run Code Online (Sandbox Code Playgroud)
我有两个模块,一个用于生产,一个用于测试
制作人员就是这样
@Provides @Singleton
public Bus provideBus () {
return BusProvider.getInstance();
}
Run Code Online (Sandbox Code Playgroud)
测试人员有这个
@Provides @Singleton
public Bus provideBus () {
return mock(Bus.class);
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2965 次 |
最近记录: |