当我登录我的应用程序并尝试从数据存储区的表中获取大小时,它是空的。但是在我重新启动应用程序之后,它可以正常工作并返回数据存储区表的大小。
就我而言,有两项活动。活动,然后片段,SettingsFragment.java有登录部分。 MainActivity.java活动包含获取数据存储区表大小的部分。
SettingsFragment.java(登录)。
// Dropbox Signin
mAccountManager = DbxAccountManager.getInstance(getActivity().getApplicationContext(), APP_KEY, SECRET_KEY);
mDropBoxPreference = findPreference("preference_sync_dbx");
mDropBoxPreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
public boolean onPreferenceClick(Preference preference) {
if (mAccountManager.hasLinkedAccount()) {
mAccountManager.unlink();
} else {
mAccountManager.startLink(getActivity(), REQUEST_LINK_TO_DBX);
}
return true;
}
});
MainActivity.java(获取数据存储区大小)。
// Dropbox Get Datastore Size
mAccountManager = DbxAccountManager.getInstance(getApplicationContext(), APP_KEY, SECRET_KEY);
if (mAccountManager.hasLinkedAccount()) {
DbxAccount mDbxAccount = mAccountManager.getLinkedAccount();
try {
mDbxStore = DbxDatastore.openDefault(mDbxAccount);
mDbxNotesTable = mDbxStore.getTable("notes");
mDbxNotesCount = mDbxNotesTable.query().count();
Log.e("mDbxNotesCount", Integer.toString(mDbxNotesCount));
} catch (DbxException e) {
e.printStackTrace();
}
}
假设数据存储区中有3条记录。 登录后,这将显示在Logcat中。
E/mDbxNotesCount﹕ 0
重新启动它后,会显示Logcat。
E/mDbxNotesCount﹕ 3
是什么导致它像这样工作?
编辑:使用smarx的答案后添加了监听器,它有效!这就是我所做的。
mDbxStore.addSyncStatusListener(new DbxDatastore.SyncStatusListener() {
@Override
public void onDatastoreStatusChange(DbxDatastore dbxDatastore) {
if (!dbxDatastore.getSyncStatus().isDownloading) {
try {
mDbxStore.sync();
mDbxNotesCount = mDbxNotesTable.query().count();
} catch (DbxException e) {
e.printStackTrace();
}
Log.e("mDbxNotesCount", Integer.toString(mDbxNotesCount));
}
}
});
答案 0 :(得分:1)
在您有机会同步之前,您似乎正在尝试阅读数据存储区的内容。您需要等到初始同步完成。我认为一种方法是通过addSyncStatusListener
添加一个监听器并等待store.getSyncStatus().isDownloading
为假。
但通常您希望遵循的模式是始终显示当前信息...因此,设置一个监听器并在其更改时更新您的UI。这样,无论是初始同步还是从其他设备引入新记录或更新,您的应用都会在信息发生变化时做出相应的响应。