【问题标题】:How I get the Context with guice in provider?如何在提供者中使用 guice 获取上下文?
【发布时间】:2012-03-16 11:30:28
【问题描述】:

我如何获得上下文?我在这里做错了吗?

这是我在 Android 中的错误:

致命异常:主要 com.google.inject.CreationException:Guice 创建错误: 1) 注入构造函数时出错,java.lang.NullPointerException

public class DatabaseProvider implements Provider {

    @Inject
    protected static Provider<Context> contextProvider;
    //eror context is null
    protected Context context = contextProvider.get();

    @Override
    public DatabaseHelper get() {
        return (DatabaseHelper) OpenHelperManager
            .getHelper(context, DatabaseHelper.class);
    }
}

实现 DaoProvider:

public class DaoProvider<D extends Dao<E, ?>, E> implements Provider<D> {

@Inject
private DatabaseProvider databaseProvider;


private final Class<E> cls;

public DaoProvider(Class<E> cls) {
    this.cls = cls;
}

@Override
public D get() {

    try {
        return databaseProvider.get().getDao(cls);

    } catch (SQLException e) {
        Log.d("injection", "database provider error", e);
    }

    return null;
}

}

在模块中实现:

public class BabyModule extends AbstractModule {
@Override
protected void configure() {

        TypeLiteral<Dao<Baby, Integer>> typeLiteral = new TypeLiteral<Dao<Baby,         Integer>>(){};
        DaoProvider<Dao<Baby,Integer>, Baby> provider = new DaoProvider<Dao<Baby,Integer>, Baby>(Baby.class);
        bind(typeLiteral).toProvider(provider);
}

}

感谢您的帮助

【问题讨论】:

  • 任何@Inject 直到构造函数运行之后才会发生。
  • 构造函数是什么意思?
  • 在完全创建对象之后之前,无法分析该对象的注入内容。因此 contextProvider.get() 在 Guice 设置 contextProvder 之前运行。
  • 您知道如何解决吗?
  • 延迟请求上下文,直到您真正需要它。

标签: android guice roboguice


【解决方案1】:

我有自己的解决方案。我现在了解了有关 application.class 的上下文。

public class DatabaseHelperProvider implements Provider<DatabaseHelper> {

    @Inject
    Application application;

    @Override
    public DatabaseHelper get() {

    return OpenHelperManager
            .getHelper(application.getApplicationContext(), DatabaseHelper.class);
    }
}

【讨论】:

    【解决方案2】:

    简单地使用

    @Inject Context context

    而不是

    @Inject protected static Provider<Context> contextProvider; //eror context is null
    protected Context context = contextProvider.get();

    应该可以解决您的问题。如果这不是你为什么不懒惰地访问上下文的原因......

    【讨论】:

    • 我已经试过了。你什么意思?如果这不是你为什么不懒惰地访问上下文的原因......
    【解决方案3】:

    更好:

    @Override
    public DatabaseHelper get(Context context) {
         return (DatabaseHelper) OpenHelperManager.getHelper(context, DatabaseHelper.class);
    }
    

    您可以从活动中获取上下文(活动正在扩展上下文)。

    【讨论】:

    • 我在模块中调用它。关于来自 guice 的 AbstractModule。
    • 如果您更改方法签名,那么它不会覆盖相同的方法
    • 所以你必须在构造函数中获取上下文 - 将它作为构造函数的参数传递。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-09
    相关资源
    最近更新 更多