gpt4 book ai didi

android - Dagger 2 第三方注入(inject) Android

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:07:22 24 4
gpt4 key购买 nike

您好,我正在尝试弄清楚如何进行干净的第三方注入(inject)。我想将 Otto 总线正确地注入(inject)我的服务和 Activity 中。我看到您可以在构造函数上使用注入(inject),但由于我没有任何 Android 构造函数,我想知道如何注入(inject)我的总线。

Iv 创建了一个提供总线新实例的模块。我还创建了一个具有 Bus 对象接口(interface)的组件。

但是我怎样才能注入(inject)它,我应该在哪里启动我的图表?

由于 Dagger 1 中的 objectGraph 被删除,我在应用程序类中使用 Dagger_.... 组件和 create(),但我应该如何将它注入(inject)到任何 Activity 或服务中?

我应该在每个 onCreate 中创建组件并从那里获取总线吗?或者是否可以像 Dagger 1 那样使用 @Inject?请告诉我,因为现在它看起来比 Dagger 1 的实现方式更加笨拙和复杂。

@Component(modules = EventBusModule.class)
@Singleton
public interface EventBus {
Bus bus();
}

@Module
public class EventBusModule {

@Provides
@Singleton
public Bus provideBus() {
return new Bus(ThreadEnforcer.ANY);
}
}

我想做的就是:

public class WearService extends WearableListenerService {
private static final String TAG = WearService.class.getSimpleName();

@Inject
protected Bus bus;

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
bus.register(this);
return START_STICKY;
}
}

我查看了这个示例 ( https://github.com/LiveTyping/u2020-mvp ),发现这是可能的,但不确定事情是如何联系在一起的。

最佳答案

Application 实例中实例化 Dagger 组件是很常见的。由于您可能没有从 Application 类中引用您的 WearService,因此您需要让 WearService 询问您的 Application 提供Bus

您可以通过两种方式做到这一点:

  • 通过将 inject(WearService wearService) 方法添加到您的 EventBus 组件:

    @Component(modules = EventBusModule.class)
    @Singleton
    public interface EventBus {
    Bus bus();

    void inject(WearService wearService);
    }

    您现在可以在您的应用程序中保留对您的组件的引用:

    public class MyApplication extends Application {

    private EventBus mEventBusComponent;

    @Override
    public void onCreate() {
    super.onCreate();

    mEventBusComponent = Dagger_EventBus.create();
    }

    public void inject(WearService wearService) {
    mEventBusComponent.inject(wearService);
    }
    }

    从您的WearService,要求您的Application注入(inject)它:

    public class WearService extends WearableListenerService {
    private static final String TAG = WearService.class.getSimpleName();

    @Inject
    protected Bus bus;

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
    ((MyApplication) getApplicationContext()).inject(this);
    bus.register(this);
    return START_STICKY;
    }
    }
  • 通过手动检索 Bus。在Application中为EventBus组件添加getter方法:

    public class MyApplication extends Application {

    private EventBus mEventBusComponent;

    @Override
    public void onCreate() {
    super.onCreate();

    mEventBusComponent = Dagger_EventBus.create();
    }

    public EventBus getEventBusComponent() {
    return mEventBusComponent;
    }
    }

    然后,在您的 WearService 中,调用 bus() 方法:

    public class WearService extends WearableListenerService {
    private static final String TAG = WearService.class.getSimpleName();

    private Bus bus;

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
    bus = ((MyApplication) getApplicationContext()).getEventBusModule().bus();
    bus.register(this);
    return START_STICKY;
    }
    }

为了将 Bus 注入(inject)到您可以实例化的类中,您可以使用构造函数注入(inject):

public class MyClass() {

private final Bus mBus;

@Inject
public MyClass(final Bus bus) {
mBus = bus;
}
}

由于 Dagger 知道如何创建一个 Bus 实例(因为你的 @Provides 方法),Dagger 现在也知道如何创建一个 MyClass 实例,不需要 @Provides 方法。例如,这将起作用:

    public class WearService extends WearableListenerService {
private static final String TAG = WearService.class.getSimpleName();

@Inject
protected Bus bus;

@Inject
protected MyClass myClass;

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
((MyApplication) getApplicationContext()).inject(this);
bus.register(this);
return START_STICKY;
}
}

MyClass 实例将自动为您创建,与 Bus 实例相同(因为它被标记为 @Singleton)。

关于android - Dagger 2 第三方注入(inject) Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28871481/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com