在Android应用程序

时间:2017-08-04 18:23:43

标签: java android memory-leaks dagger-2 greendao

我在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类中对它进行排序,这样我就可以全局访问一个连接(除非有更好的方法)。

1 个答案:

答案 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();

不确定这是不是很好的做法,但它解决了我的问题。如果有人有任何更好的想法,如何结构,这很高兴听到它。