很抱歉,我的问题/代码和我的英语技能:)我想使用达格-2在我的新android应用程序。我没有使用Dagger-2或其他依赖库的经验。我想我误解了什么..。
这是相关的应用程序。如果活动"OverviewActivity“启动,它会注入"OverviewPresenter”等等。(OverviewActivity->OverviewPresenter->CategoriesPovider->DBOpenHelper->DBDefaults).
在第一次启动时,类DBDefaults应该用一些默认值预先填充数据库。当它应该访问资源文件时,我得到了一个NPE。有人能告诉我为什么会这样吗?我尝试使用“日志”工具来检查所需变量是否为null,但一切看起来都很好。获取错误的上下文的DBDefaults类?
最后,该方法抛出一个NPE。
context.getResources().getStringArray(R.array.category_colors);但这是我的密码。AppComponent.java
@Singleton
@Component(modules = AppModule.class)
public interface AppComponent {
Context getContext();
Application getApplication();
DBOpenHelper getDBOpenHelper();
}AppModule.java
@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
@ActivityScope
@Component(dependencies = AppComponent.class)
public interface OverviewComponent {
void inject(OverviewActivity activity);
OverviewPresenter getOverviewPresenter();
}OverviewPresenter.java
public class OverviewPresenter extends MvpBasePresenter<OverviewView> {
@Inject
public OverviewPresenter(CategoriesProvider provider) {
Log.d("OverviewPresenter", "presenter..");
}
}CategoriesProvider.java
public class CategoriesProvider extends BaseProvider {
@Inject
public CategoriesProvider(DBOpenHelper dbOpenHelper) {
super(dbOpenHelper);
// Just testing...
dbOpenHelper.getReadableDatabase();
}
}DBOpenHelper.java
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
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
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;
}
}我的活动
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();
}
}发布于 2015-11-30 21:26:14
如果CategoriesProvider是ContentProvider,则在调用Application.getApplicationContext()时可能会得到null。所以你注入的上下文可能是空的。您可以在AppModule中验证这一点。尝试在返回结果之前记录结果。请注意,Application.getApplicationContext()通常返回相同的实例,因此您可以只返回return app;而不是当前的。
https://stackoverflow.com/questions/33988775
复制相似问题