我在Android应用程序中集成数据库连接的位置/方式遇到了一些麻烦。在尝试了几种不同的方法后,我决定扩展应用程序类并将其放在那里。据我所知,虽然我需要它是静态的,所以我可以从任何地方访问它,我正在使用GreenDAO,它需要Application上下文才能工作。
现在的问题是我已经开始使用Dagger2(我不太懂,但不知何故让它工作了),但它不允许静态注入。下面是MyApp类:
public class MyApp extends Application {
@Inject
public DataSource dataSource;
private static MyApp instance;
public MyApp() {
instance = this;
}
@Override
public void onCreate() {
super.onCreate();
// Connect to our datasource
if (dataSource == null) {
DaggerDataSourceComponent.builder().dataSourceModule(new DataSourceModule(getInstance())).build();
}
}
public static MyApp getInstance() {
return instance;
}
public DataSource getDataSource() {
return dataSource;
}
}
这是我的DataSource类:
public class DataSource {
public DaoSession daoSession;
Context context;
public Database db;
@Inject
public DaoMaster.DevOpenHelper helper;
public DataSource(Context context, DaoMaster.DevOpenHelper helper) {
this.context = context;
this.helper = helper;
db = this.helper.getWritableDb();
daoSession = new DaoMaster(db).newSession();
}
通常这一切都运行正常,但是一旦我开始旋转屏幕,我就会收到数据库内存泄漏。我认为这是因为数据库不是静态的,并且正在每次轮换时重新创建?我无法在我的Activity中创建数据库连接,因为我在MVP中理解,活动应该不了解这些事情。
关于如何解决这些内存泄漏的任何建议都将不胜感激。
更新
在玩之后,似乎并没有在MyApp中注入DataSource实际上正在工作,事实证明它只在我的交互器类中工作(它也注入了DataSource),所以我没有意识到它是在MyApp类中什么也不做。如果可能的话,我仍然希望在MyApp类中对它进行排序,这样我就可以全局访问一个连接(除非有更好的方法)。
答案 0 :(得分:0)
看起来我很蠢。在MyApp中我需要添加.inject(this),所以
DaggerDataSourceComponent.builder().dataSourceModule(new DataSourceModule(getInstance())).build();
变为
DaggerDataSourceComponent.builder().dataSourceModule(new DataSourceModule(getInstance())).build().inject(this);
我现在有一个数据库连接被创建并且即使在活动被销毁时仍然存在,并且可以在整个应用程序中进行访问:
dataSource = MyApp.getInstance().getDataSource();
不确定这是不是很好的做法,但它解决了我的问题。如果有人有任何更好的想法,如何结构,这很高兴听到它。