创建RoomDatabase的对象以在回调中使用之间的区别是什么,如第83行和第88行的BasicSample示例中所示,
和,
在回调中使用RoomDatabase的成员变量,就像第71行的android-room-with-a-view示例中的内容一样?
我不是在征求意见,我问这两个例子之间是否存在差异或好处?
我不知道为什么没有答案
简而言之
简而言之,两个代码都非常相似。他们检查成员变量的值。如果该值已存在,则只需返回该值而不创建新对象。否则,如果变量的值为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;
}