根据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));
}
}
其他2类:
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
始终为null。我有什么想念的吗?谢谢。
最佳答案
在每个类上,您都需要执行@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”。为此,您可以通过Singleton来访问
ObjectGraph
,这不是很优雅,但是有时候,如果您不能通过Context
,它是唯一的选择。但是,如果确实有
Context
,则可以按照此链接上的示例进行操作:https://github.com/nuria/android-examples/tree/master/dagger-logger-example/Sample/src/com/example/android/ui
并查看它们如何使
ObjectGraph
(在DemoApplication
中定义为int)可以从DemoBaseActivity
访问。