根据JakeWharton在https://speakerdeck.com/jakewharton/2014处的幻灯片97,对象图允许注入类。
但是,我确实尝试过,但得到了NPE,似乎从未调用过该类的构造函数。

我的代码如下。我提供AppModuleAnalyticsManager没问题。

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访问。

10-08 20:01