我在我的应用程序中使用多个房间数据库。我想在必要的活动中打开它,然后在 on destroy 方法中关闭它,但有时可能会出现延迟。我需要做出更好的改进。您能否更正这个简单的示例并创建一个文档?
数据库类
@Database(entities = {UserFood.class}, version = 1, exportSchema = false)
public abstract class UserFoodDatabase extends RoomDatabase {
public abstract UserFoodDao daoAccess();
public static volatile UserFoodDatabase userFoodDatabase;
public static UserFoodDatabase getDatabase(final Context context) {
if (userFoodDatabase == null) {
synchronized (UserFoodDatabase.class) {
if (userFoodDatabase == null) {
userFoodDatabase = Room.databaseBuilder(context.getApplicationContext(),
UserFoodDatabase.class, USER_FOODS_DB_NAME)
.build();
}
}
}
return userFoodDatabase;
}
}
单例助手类
public class AppDatabaseHelper {
private static volatile UserFoodDatabase userFoodDatabase;
public static UserFoodDatabase getUserFoodDatabase(Context context) {
if (userFoodDatabase == null) {
userFoodDatabase = UserFoodDatabase.getDatabase(context);
}
return userFoodDatabase;
}
public static void closeUserFoodDatabase() {
if (userFoodDatabase != null) {
if (userFoodDatabase.isOpen()) {
userFoodDatabase.close();
}
if (userFoodDatabase != null) {
userFoodDatabase = null;
}
}
}
}
一些活动
public class FoodListActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_food_list);
ExecutorService executor = Executors.newSingleThreadExecutor();
Handler handler = new Handler(Looper.getMainLooper());
executor.execute(() -> {
UserFoodDao userFoodDao = AppDatabaseHelper.getUserFoodDatabase(FoodListActivity.this).daoAccess();
handler.post(this::dataLoadMethod);
executor.shutdown();
});
}
@Override
protected void onDestroy() {
Log.d("LIFECYCLE", "onDestroy");
new Thread(() -> {
AppDatabaseHelper.closeUserFoodDatabase();
}).start();
super.onDestroy();
}
}
我创建了单例帮助器类,但我无法确定它是否正确。另外,房间数据库中的打开、关闭、重新打开操作是如何进行的?
用户食品数据库:
public abstract class UserFoodDatabase extends RoomDatabase {
public abstract UserFoodDao daoAccess();
private static final String USER_FOODS_DB_NAME = "user_foods_db";
private static UserFoodDatabase userFoodDatabaseInstance;
public static UserFoodDatabase getDatabase(final Context context) {
if (userFoodDatabaseInstance == null) {
synchronized (UserFoodDatabase.class) {
if (userFoodDatabaseInstance == null) {
userFoodDatabaseInstance = Room.databaseBuilder(context.getApplicationContext(),
UserFoodDatabase.class, USER_FOODS_DB_NAME)
.build();
}
}
}
return userFoodDatabaseInstance;
}
}
应用程序数据库助手:
public class AppDatabaseHelper {
private static volatile UserFoodDatabase userFoodDatabaseInstance;
public static UserFoodDatabase getUserFoodDatabase(Context context) {
if (userFoodDatabaseInstance == null) {
userFoodDatabaseInstance = UserFoodDatabase.getDatabase(context);
}
return userFoodDatabaseInstance;
}
public static void closeUserFoodDatabase() {
if (userFoodDatabaseInstance != null && userFoodDatabaseInstance.isOpen()) {
userFoodDatabaseInstance.close();
}
}
}
食物清单活动:
public class FoodListActivity extends AppCompatActivity {
private ExecutorService executor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_food_list);
executor = Executors.newSingleThreadExecutor();
executor.execute(() -> {
UserFoodDao userFoodDao = AppDatabaseHelper.getUserFoodDatabase(FoodListActivity.this).daoAccess();
runOnUiThread(this::dataLoadMethod);
});
}
@Override
protected void onDestroy() {
Log.d("LIFECYCLE", "onDestroy");
executor.shutdown(); // Properly shut down the executor
AppDatabaseHelper.closeUserFoodDatabase();
super.onDestroy();
}
}
这些更改可确保 Android 应用程序中 Room 数据库的正确初始化、使用和关闭,并更好地处理线程和潜在延迟。