简体   繁体   English

如何在非活动类中注入Context?

[英]How to inject Context in non-activity class?

I am trying to inject Context in non-activity class. 我试图在非活动类中注入Context。 In my case, I am trying to inject in Model class (from MVP pattern). 在我的情况下,我试图注入Model类(来自MVP模式)。 I need Context to get string from resources. 我需要Context来从资源中获取字符串。 The method result() returns Observable which returns ViewModel which is modified API model. 方法result()返回Observable,它返回ViewModel,它是修改后的API模型。 ViewModel is used to show in MainActivity. ViewModel用于在MainActivity中显示。 I tried this code, but Context is null, I think that it is not injected. 我尝试了这段代码,但Context是null,我认为它不是注入的。

public class MainActivityModel implements MainActivityMVP.Model {

@Inject
Context context;

private Repository repository;

public MainActivityModel(Repository repository) {

    ((App) getApplication()).getComponent().inject(this); //Cannot resolve getApplication() method :(
    this.repository = repository;

}

@Override
public Observable<List<ViewModel>> result(String username) {

    return repository.getRepositories(username).map(new Func1<List<Repository>, List<ViewModel>>() {
        @Override
        public List<ViewModel> call(List<Repository> repositories) {

            List<ViewModel> viewModelList = new ArrayList<ViewModel>();
            for (Repository repository : repositories) {
                // here Context is null
                viewModelList.add(new ViewModel(context.getString(R.string.repository) + repository.getName()));
            }

            return viewModelList;

        }
    });

}

} }

This is Component class, where there is inject(MainActivityModel target) method which I am not able to use inject MainActivityModel because getApplication is not available from non-Activity class: 这是Component类,其中有注入(MainActivityModel目标)方法,我无法使用注入MainActivityModel,因为getApplication不可用于非Activity类:

@Singleton
@Component(modules = {ApplicationModule.class, MainActivityModule.class, GithubApiModule.class})
public interface ApplicationComponent {

    void inject(MainActivity target);
    void inject(MainActivityModel target);

}

I think that Context can be sent via result(String username, Context context) method. 我认为Context可以通过result(String username,Context context)方法发送。 But what is the meaning of Dependency Injection if I passing Context as method parameter? 但是如果我将Context作为方法参数传递,那么Dependency Injection的含义是什么? Maybe I misunderstood fundamental concept of DI. 也许我误解了DI的基本概念。

So my question: is it possible to inject Context in non-activity class? 所以我的问题是:是否有可能在非活动类中注入Context? Or it should be passed as method parameter? 或者它应该作为方法参数传递?

For injecting a Context you will need to write a module with a provides method: 要注入Context,您需要使用provide方法编写一个模块:

@Module (injects = {MainActivityModel.class})
    public class RootModule {
    private Context context;

    public RootModule(App application) {
        this.context = application.getApplicationContext();
    }

    @Provides
    @Singleton
    Context provideContext() {
        return context;
    }
}

In your custom App class: 在您的自定义App类中:

public class App extends Application {
    public ObjectGraph objectGraph;

    @Override
    public void onCreate() {
        super.onCreate();
        objectGraph = ObjectGraph.create(getInjectionModule());
    } 

    protected Object getInjectionModule() {
        return new RootModule(this);
    }
}

And inject in model's constructor: 并注入模型的构造函数:

public MainActivityModel(Repository repository) {

    ((App) getApplication()).objectGraph.inject(this); 
    this.repository = repository;

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM