15

我正在尝试使用 ORMLite 包创建一个 android 应用程序。我有一些活动和服务,并且还使用https://github.com/tomquist/Android-Error-Reporter能够从客户的 PDA 接收错误。ORMLite 要求所有活动和服务扩展 OrmLiteBaseActivity 等或向每个活动添加适当的代码,以便能够在活动完成后获取数据库助手并释放它。因此,将此代码添加到每个活动或服务中并不是很方便。我也有一些可以使用数据库的辅助类

我还有一个包含一些全局信息和方法的应用程序类。所以我决定在应用程序类中打开 ormlite 助手,并在所有活动/类中使用它,如下所示:

public class MyApplication extends Application {
  private volatile DatabaseHelper databaseHelper = null;

  @Override
  public void onCreate() {
    super.onCreate();
  }

  @Override
  public void onTerminate() {
    if (databaseHelper != null) {
      OpenHelperManager.releaseHelper();
      databaseHelper = null;
    }
    super.onTerminate();
  }

  public DatabaseHelper getHelper() {
    if (databaseHelper == null) {
      databaseHelper = OpenHelperManager.getHelper(this, DatabaseHelper.class);
    }
    return databaseHelper;
  }
}

并以这种方式在其他类中使用它:

((MyApplication) getApplicationContext()).getHelper();

您认为以这种方式使用它是一个好主意,还是可能存在一些内存泄漏或其他问题?我担心 onTerminate 永远无法在真实设备上运行......我正处于“尝试新东西”的阶段,所以想听听对此的任何评论,以消除我在未来使用错误方法可能遇到的问题并且没有重写代码。

4

1 回答 1

7

整体机制看起来不错@Alex,但据我所知,onTerminate()它只用于模拟环境,所以没有太多用处。当您的程序在真实设备上终止时,您的程序会被 Android 操作系统杀死,因此没有理由担心内存泄漏等问题。

你的代码最重要的是它保证了一个databaseHelper实例。每个实例都有自己的数据库连接,当程序中打开一 (1) 个以上的数据库连接时,就会出现问题。Sqlite同时使用同一个连接处理多个线程,但它不能很好地处理多个连接,并且可能会出现数据不一致的情况。

于 2011-11-21T15:10:42.360 回答