Roboguice 2.0 внедряет приложение в POJO

Я новичок в Roboguice, пожалуйста, помогите. У меня есть приложение calss MyApplication, в котором в методе onCreate я инициализирую некоторые данные. Также у меня есть POJO с бизнес-логикой, которую я хочу использовать в своем MainActivity (см. фрагменты кода ниже). Мне нужно ввести MyApplication в POJO, чтобы получить доступ к данным, которые я инициализирую в onCreate приложения, но этот код вызывается перед onCreate, и у меня есть NullPointerException.

public class MyApplication extends Application {

    private Properties applicationProperties;

    @Override
    public void onCreate() {
        super.onCreate();
        applicationProperties = loadApplicationProperties(APPLICATION_PROPERTIES_ASSET);
    }

    @SuppressWarnings("unchecked")
    public String getProperty(String key) {
        return applicationProperties.getProperty(key);
    }

}

@Singleton
public class POJO {

    @Inject
    private MyApplication application;

    @Inject
    public void init() {
        // NPE here, because application onCreate not called at this moment
        serverURL = application.getProperty(Constants.SERVER_URL);
    }
}

public class MainActivity extends RoboActivity {

    @Inject
    private POJO myPOJO;

}

person Dmitriy Tarasov    schedule 31.08.2012    source источник
comment
Удалось ли вам решить ее в конце концов?   -  person Thomas Kaliakos    schedule 11.01.2013
comment
Пока нет, я просто делаю свое приложение синглтоном и получаю экземпляр в POJO через MyApplication.getInstance() без инъекции   -  person Dmitriy Tarasov    schedule 12.01.2013


Ответы (2)


EDIT: нашел способ сделать это в RoboGuice 2.0 на основе ответа в контексте приложения пользовательского модуля RoboGuice.

Вставьте контекст приложения в конструктор AbstractModule, затем привяжите его в configure() для последующего внедрения:

public final class MyModule extends AbstractModule
{
    private final MyApplication context;

    @Inject
    public MyModule(final Context context)
    {
        super();
        this.context = (MyApplication)context;
    }

    @Override
    protected void configure() {
        bind(MyApplication.class).toInstance(context);
    }

}

person Jon Adams    schedule 26.03.2013
comment
Ошибка code.google.com/p/ roboguice/issues/ в RoboGuice 2.0, что в некоторых случаях может потребовать привязки к провайдеру, который просто обертывает экземпляр контекста. См. groups.google.com/forum/#!msg/roboguice/XYZdGm_2fNg. / например, обходной код. - person Jon Adams; 26.03.2013

Если данные, которые вам нужны, не требуют контекста, а просто имеют доступ к ресурсам XML или res/raw, вы можете внедрить их из любого места.

Просто используйте Roboguice.getInjector(), чтобы получить копию объекта Resources.

person Charles Munger    schedule 26.03.2013