Ошибка при внедрении контекста в AsyncTask с использованием Guice Assisted Inject Factory

Я создаю проект Android с использованием RoboGuice 2.0 с помощью расширения Guice - Assisted Inject. Прямо сейчас я сталкиваюсь с проблемой внедрения контекста через фабрику в потоке без пользовательского интерфейса.

Пример проекта с показом моей проблемы:

Персональный интерфейс:

public interface Person {
}

Персональная реализация:

@AssistedInject
public PersonImpl(@Assisted String name, @Assisted int age, Context context) {
}

@Inject
public PersonImpl(Context context) {
}

Перфонская фабрика:

Person create(@Assisted String name, @Assisted int age);

Модуль:

private static class TestModule extends AbstractModule {
    @Override
    protected void configure() {
        bind(Person.class).to(PersonImpl.class);
        install(new FactoryModuleBuilder()
                .implement(Person.class, PersonImpl.class)
                .build(PersonFactory.class));
    }
}

Основная деятельность:

@Inject
private PersonFactory personFactory;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    new AsyncTask<Void, Void, Void>() {
        @Override
        protected Void doInBackground(Void... params) {
            Person p = RoboGuice.getInjector(MainActivity.this).getInstance(Person.class);
            Log.d("TAG", "By injector " + p.toString());
            p = personFactory.create("AAA", 123);
            Log.d("TAG", "By factory " + p.toString());
            return null;
        }
    }.execute();
}

Когда AsyncTask выполняется, инжектор создает объект Person. Эта операция работает нормально и, как и ожидалось, возвращает объект PersonImpl. Однако когда фабрика пытается создать новый объект Person, возникает это исключение:

   java.lang.RuntimeException: An error occured while executing doInBackground()
        at android.os.AsyncTask$3.done(AsyncTask.java:300)
        at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
        at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
        at java.util.concurrent.FutureTask.run(FutureTask.java:242)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
        at java.lang.Thread.run(Thread.java:841)
 Caused by: java.util.EmptyStackException
        at java.util.Stack.peek(Stack.java:57)
        at roboguice.inject.ContextScope$1.get(ContextScope.java:108)
        at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:41)
        at com.google.inject.internal.SingleParameterInjector.inject(SingleParameterInjector.java:38)
        at com.google.inject.internal.SingleParameterInjector.getAll(SingleParameterInjector.java:62)
        at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:107)
        at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:88)
        at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:269)
        at com.google.inject.internal.InjectorImpl$3$1.call(InjectorImpl.java:1005)
        at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1051)
        at com.google.inject.internal.InjectorImpl$3.get(InjectorImpl.java:1001)
        at com.google.inject.assistedinject.FactoryProvider2.invoke(FactoryProvider2.java:665)
        at $Proxy6.create(Native Method)
        at eu.stosdev.MainActivity$1.doInBackground(MainActivity.java:25)
        at eu.stosdev.MainActivity$1.doInBackground(MainActivity.java:20)

Если эти операции создания предварительно сформированы в потоке пользовательского интерфейса, оба объекта PlayerImpl создаются правильно. Я только начал использовать Google Guice, и меня смущает, почему, когда объект создается с помощью инжектора, все нормально, а с фабрикой - нет. Есть ли хорошее решение, как использовать фабрику на темы?

0 ответов

Другие вопросы по тегам