根据JakeWharton在https://speakerdeck.com/jakewharton/2014的幻灯片97,对象图允许注入一个类。 但是,我确实尝试过,我得到了一个NPE,似乎从未调用过该类的构造函数。
我的代码如下。我对AppModule
提供AnalyticsManager
没有问题。
public class App extends Application implements ModuleCreator {
private ObjectGraph objectGraph;
@Inject
AnalyticsManager analyticsManager;
@Override
public void onCreate(){
super.onCreate();
objectGraph = ObjectGraph.create(getModules().toArray());
objectGraph.inject(RealBusEvent.class);
objectGraph.inject(Trip.class);
objectGraph.inject(this);
analyticsManager.registerAppEnter();
}
public List<Object> getModules() {
return Arrays.<Object>asList(new AppModule(this));
}
}
其他两个班级:
public class RealBusEvent {
@Inject Trip trip;
@Inject
public RealBusEvent(){; }
public Trip getTrip() {
return trip;
}
}
public class Trip {
@Inject
public Trip(){
this.time = 123;
}
public Trip(long time) {
this.time = time;
}
public long getTime() {
return time;
}
private long time;
}
使用RealEventBus
的课程如下:
public class MyActivity extends Activity {
@Inject RealBusEvent event;
TextView mTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
mTextView = (TextView) findViewById(R.id.txtView);
Button button = (Button) findViewById(R.id.btn);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mTextView.setText(String.valueOf(event.getTrip().getTime()));
}
});
}
}
我对象event
始终为空。我错过了什么吗?
感谢。
答案 0 :(得分:1)
在每个课程中你需要执行一个@Inject
,你必须调用:objectGraph.inject(this);
通常你把它放在构造函数中,如下所示:
public class RealBusEvent {
@Inject Trip trip;
@Inject
public RealBusEvent(){
YOU_OBJECTGRAPH_REFERENCE.inject(this);
}
public Trip getTrip() {
return trip;
}
}
主要的挑战是如何获得 YOU_OBJECTGRAPH_REFERENCE &#39;如果你没有“上下文”。为此,您可以通过单身人士访问ObjectGraph
,而不是非常优雅,但有时如果您无法通过Context
,它就是唯一的选择。
但是如果你有Context
,你可以按照这个链接上的例子:
https://github.com/nuria/android-examples/tree/master/dagger-logger-example/Sample/src/com/example/android/ui
并查看如何,ObjectGraph
(DemoApplication
中定义的DemoBaseActivity
可以从{{1}}访问。