我在哪里/如何在我的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();
}


通常这一切都可以,但是一旦我开始旋转屏幕,我就会发现数据库内存泄漏。我认为这是由于数据库不是静态的,并且每次旋转都会重新创建?我无法在我的活动中创建数据库连接,正如我在MVP中所了解的那样,活动不应该了解此类情况。

我应该如何解决这些内存泄漏的任何建议将不胜感激。

更新:

在玩了之后,似乎似乎没有在MyApp中注入DataSource实际上有效,事实证明它仅在我的交互器类中起作用(该类也注入了DataSource),所以我没有意识到它没有做任何事情。 MyApp类。仍然,如果可能的话,我还是希望在MyApp类中对它进行排序,以便可以全局访问单个连接(除非有更好的方法)。

最佳答案

看起来我很蠢。在MyApp中,我需要添加.inject(this),因此

DaggerDataSourceComponent.builder().dataSourceModule(new DataSourceModule(getInstance())).build();


变成

DaggerDataSourceComponent.builder().dataSourceModule(new DataSourceModule(getInstance())).build().inject(this);


现在,我有一个数据库连接可以创建,并且即使活动被破坏也可以保留,并且可以在整个应用程序中进行访问:

dataSource = MyApp.getInstance().getDataSource();


不知道这是否是个好习惯,但这解决了我的问题。如果有人对如何组织这个有更好的想法,我们很高兴听到。

07-24 09:47
查看更多