当前位置: 首页 > 知识库问答 >
问题:

匕首2第三部分注射Android

高自怡
2023-03-14

嗨,我试图找出如何做一个干净的第三方注入。我想把奥托巴士适当地注入我的服务和活动中。我看到你可以在构造函数上使用inject,但是由于我没有任何Android构造函数,我想知道我如何才能inject我的总线。

Iv创建了一个模块,该模块提供了总线的新实例。Iv还创建了一个组件,该组件具有总线对象的接口。

但是我如何才能得到这个注入,我应该在哪里启动我的图表?

@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),看到它是可能的,但不确定事情是如何联系在一起的。

共有1个答案

东深
2023-03-14

通常在application实例中实例化Dagger组件。由于您的应用程序类可能没有对WearService的引用,因此需要让WearService要求您的应用程序提供总线

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

>

  • 通过向EventBus组件添加inject(WearService WearService)方法:

    @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);
        }
    }
    
    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;
        }
    }
    

    通过手动检索总线。在应用程序中为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;
        }
    }
    

    为了将总线注入到可以实例化的类中,可以使用构造函数注入:

    public class MyClass() {
    
      private final Bus mBus;
    
      @Inject
      public MyClass(final Bus bus) {
        mBus = bus;
      }
    }
    
        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;
            }
        }
    

  •  类似资料:
    • 我正在MVVM和Dagger 2中制作小型Android应用程序。但是我不知道如何正确使用Dagger 2,以防我有一个活动和两个片段。这两个片段都是ViewModels的所有者。我已经将ViewModelProvider注入了片段,但我仍然对这个解决方案感到困惑。也许有人会改进我的代码? 活动: 第一个片段: 第二个片段: 在这种情况下,两个片段都可以工作,但我只能在其中一个片段中注入ViewM

    • 这很好,但是如果我使用全局组件甚至子组件中的一个模块,那么应该传入上下文。因此,这意味着如果我用匕首注入演示器,它将被绑定到ApplicationContext。这使得作为JUnit进行测试变得困难。Android代码不应该在演示器中。 所以我想问的是,最好的做法是只在活动、片段、广播接收器和服务中使用匕首吗?就mvp架构而言,这就是。另一个解决方案是设计另一个dagger组件,但不是与appco

    • 我不熟悉匕首和莫基托。我尝试在单元测试中使用Dagger模块中定义的构造函数,以便使用默认值创建对象。 这是模块: @模块类自动关闭倒计时模块{ 这就是我在单元测试中模拟AutoCloseCountDown类的方法: @RunWith(MockitoJUnitRunner.class)公共类AutoCloseCountDownTimerTest{ 如何实现自动关闭的CountDownTimer将在

    • Dagger 2即将面世,但可用的示例甚至无法立即编译,文档是Dagger 1的复制粘贴替换。 有没有人有一个在谷歌的Dagger 2上运行的正确应用程序的例子?

    • 我目前正在尝试将匕首2集成到一个Android应用程序中。我的项目设置如下: 库 应用程序(取决于库) 在我的library项目中,我定义了一个类,以后我将把它注入到库和app项目中需要它的其他类(活动和常规类)中。 我也是这么想的,因为实际上myManager总是空的。很明显,它的构造函数也从来没有被调用过,所以我想我一定遗漏了一些配置方面的东西?或者也许我误解了文档,它根本不是这样工作的?My

    • 问题内容: 我可能错过了一些东西,但我认为像@Singleton这样的作用域用于定义“作用域生命周期”。 我在Android应用程序中使用了Dagger 2(但我认为问题根本与android相关)。 我有1个模块: 我有两个与范围不同的组件: 两者,并且,有一个构造函数。虽然MenuPresenter期望将其作为参数,但LoginPresenter却采用了: 但是每次我使用这些组件创建一个或时,都