首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Dagger-2 -无法访问我的xml资源

Dagger-2 -无法访问我的xml资源
EN

Stack Overflow用户
提问于 2015-11-29 22:13:47
回答 1查看 792关注 0票数 0

很抱歉,我的问题/代码和我的英语技能:)我想使用达格-2在我的新android应用程序。我没有使用Dagger-2或其他依赖库的经验。我想我误解了什么..。

这是相关的应用程序。如果活动"OverviewActivity“启动,它会注入"OverviewPresenter”等等。(OverviewActivity->OverviewPresenter->CategoriesPovider->DBOpenHelper->DBDefaults).

在第一次启动时,类DBDefaults应该用一些默认值预先填充数据库。当它应该访问资源文件时,我得到了一个NPE。有人能告诉我为什么会这样吗?我尝试使用“日志”工具来检查所需变量是否为null,但一切看起来都很好。获取错误的上下文的DBDefaults类?

最后,该方法抛出一个NPE。

代码语言:javascript
复制
context.getResources().getStringArray(R.array.category_colors);

但这是我的密码。AppComponent.java

代码语言:javascript
复制
@Singleton
@Component(modules = AppModule.class)
public interface AppComponent {
    Context getContext();
    Application getApplication();
    DBOpenHelper getDBOpenHelper();
}

AppModule.java

代码语言:javascript
复制
@Module
public class AppModule {
    private final Manager app;

    public AppModule(Manager app) {
        this.app = app;
    }

    @Singleton
    @Provides
    public Application provideApplication() {
        return app;
    }

    @Singleton
    @Provides
    public Context provideContext() {
        return app.getApplicationContext();
    }

    @Singleton
    @Provides
    public DBOpenHelper provideDBOpenHelper() {
        return new DBOpenHelper(app);
    }
}

OverviewComponent.java

代码语言:javascript
复制
@ActivityScope
@Component(dependencies = AppComponent.class)
public interface OverviewComponent {
    void inject(OverviewActivity activity);
    OverviewPresenter getOverviewPresenter();
}

OverviewPresenter.java

代码语言:javascript
复制
public class OverviewPresenter extends MvpBasePresenter<OverviewView> {

    @Inject
    public OverviewPresenter(CategoriesProvider provider) {
        Log.d("OverviewPresenter", "presenter..");
    }
}

CategoriesProvider.java

代码语言:javascript
复制
public class CategoriesProvider extends BaseProvider {

    @Inject
    public CategoriesProvider(DBOpenHelper dbOpenHelper) {
        super(dbOpenHelper);
        // Just testing...
        dbOpenHelper.getReadableDatabase();
    }
}

DBOpenHelper.java

代码语言:javascript
复制
public class DBOpenHelper extends SQLiteOpenHelper {

    private static final String db = "manager";
    private static final int version = 1;
    private Context context;

    @Inject
    public DBOpenHelper(Context context) {
        super(context, db, null, version);
        this.context = context;
        Log.d("DBOpenHelper", "database...");
        if (context == null) {
            Log.d("DBOpenHelper", "wtf...");
        }
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // db structure
        db.execSQL(CategoriesTable.getCreateTableQuery());
        db.execSQL(UsersTable.getCreateTableQuery());

        // default values
        DBDefaults defaults = new DBDefaults(db, context);
        defaults.insertSystemUser();
        defaults.insertCategories();
    }
}

DBDefaults.java

代码语言:javascript
复制
public class DBDefaults {
    private SQLiteDatabase db;
    private Context context;

    public DBDefaults(SQLiteDatabase db, Context context) {
        this.db = db;
        this.context = context;
        if (context == null) {
            Log.d("DBDefaults", "wtf... in Defaults");
        }
    }

    public void insertCategories() {
        String[] test = context.getResources().getStringArray(R.array.category_colors);
        for (String item : test) {
            Log.d("Categories", item);
        }
        // NPE ?!?!?!
    }
}

编辑我的Manger类。在这里,我存储我的应用程序组件,并插入我的AppModule

代码语言:javascript
复制
public class Manager extends Application {
    private AppComponent appComponent;

    @Override
    public void onCreate() {
        super.onCreate();
        appComponent = DaggerAppComponent.builder().appModule(new AppModule(this)).build();
    }

    public AppComponent getAppComponent() {
        return appComponent;
    }
}

我的活动

代码语言:javascript
复制
public class OverviewActivity extends MvpActivity<OverviewView, OverviewPresenter> {

    public OverviewComponent overviewComponent;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_navigation);
    }

    @Override
    public void inject() {
        Log.d("Activity", "inject");
        overviewComponent = DaggerOverviewComponent.builder()
                .appComponent(((MoneyManager)getApplication()).getAppComponent())
                .build();
        overviewComponent.inject(this);
    }

    @Override
    public OverviewPresenter getPresenter() {
        Log.d("Activity", "getPresenter");
        return overviewComponent.getOverviewPresenter();
    }
}
EN

回答 1

Stack Overflow用户

发布于 2015-11-30 21:26:14

如果CategoriesProviderContentProvider,则在调用Application.getApplicationContext()时可能会得到null。所以你注入的上下文可能是空的。您可以在AppModule中验证这一点。尝试在返回结果之前记录结果。请注意,Application.getApplicationContext()通常返回相同的实例,因此您可以只返回return app;而不是当前的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33988775

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档