在回调内创建Room Database实例或使用该数据库的成员变量

问题描述 投票:1回答:1

创建RoomDatabase的对象以在回调中使用之间的区别是什么,如第83行和第88行的BasicSample示例中所示,

和,

在回调中使用RoomDatabase的成员变量,就像第71行的android-room-with-a-view示例中的内容一样?

我不是在征求意见,我问这两个例子之间是否存在差异或好处?

我不知道为什么没有答案

java android callback android-room
1个回答
0
投票

简而言之

简而言之,两个代码都非常相似。他们检查成员变量的值。如果该值已存在,则只需返回该值而不创建新对象。否则,如果变量的值为null,则在这种情况下创建一个新对象,将该对象分配给成员变量,然后返回该值。

在长

您提到的代码都只是为了实现Singleton Pattern。有多种方法可以实现这一目标:

android-architecture-components存储库

AppDatabase database = AppDatabase.getInstance(appContext, executors);

在上面的代码中,我们调用了getInstance(.. , ..)方法,该方法通过以下方式实现单例模式:

public static AppDatabase getInstance(final Context context, final AppExecutors executors) {
if (sInstance == null) {
    synchronized (AppDatabase.class) {
        if (sInstance == null) {
            sInstance = buildDatabase(context.getApplicationContext(), executors);
            sInstance.updateDatabaseCreated(context.getApplicationContext());
        }
    }
}
   return sInstance;
}

getInstance()方法并不总是创建新的Object。相反,它检查成员变量sInstance的值。如果值为null,则为其指定DB对象的值,然后返回该值。如果值不为null,只需返回已存储的值,即先前DB对象的值。

android-room-with-a-view存储库

它也做了同样的事情,即使用相同的单例值INSTANCE并将其传递给AsyncTask的新对象。

new PopulateDbAsync(INSTANCE).execute();

单身模式

static WordRoomDatabase getDatabase(final Context context) {
    if (INSTANCE == null) {
        synchronized (WordRoomDatabase.class) {
            if (INSTANCE == null) {
                INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
                        WordRoomDatabase.class, "word_database")
                        // Wipes and rebuilds instead of migrating if no Migration object.
                        // Migration is not part of this codelab.
                        .fallbackToDestructiveMigration()
                        .addCallback(sRoomDatabaseCallback)
                        .build();
            }
        }
    }
    return INSTANCE;
} 
© www.soinside.com 2019 - 2024. All rights reserved.