4

嗨我使用的是谷歌雲端硬盤API存儲使用AppDataFolder設施的數據庫。我有一個測試應用程序在一臺設備上成功運行。我可以上傳/更新/刪除/下載數據庫文件並將其重新集成到程序中,而不會出現任何問題。谷歌Android播放/硬盤API

我遇到的問題是,當我想與運行相同的應用程序其它設備共享這個數據庫,那麼事情就不會達到預期效果。示例設備A我上傳數據庫,設備B - 我想下載數據庫,但沒有找到文件(此延遲可能會在幾秒到幾小時之間變化很大)。原因 - 使用Api時,它決定何時「同步」數據,因爲它是排隊的,而不是立即上傳。因此,當在一臺設備上使用時,這不是一個問題,因爲它需要來自雲存儲的「同步」文件,或等待同步的文件。

我已經嘗試過各種事情,比如嘗試列出所有AppDataFolder文件或通過帶有可搜索過濾器的查詢來檢索元數據,然後再進行更新/刪除等請求。但是,我無法讓它按照所需工作從根本上選擇它何時進行同步。

所以我實際的問題是:我怎麼能強迫谷歌驅動器同步我的文件時,我希望它即每次提出要求時,使同步跨使用相同的應用程序多個設備實現。必須有一個答案,因爲我認爲這是你使用AppDataFolder的第一位的根本原因。

在此先感謝

編輯/ UPDATE:

我已經能夠找到在API的選項設置爲 '同步' 使用此代碼的驅動器的內容:

  // try to sync 
      Drive.DriveApi.requestSync(mGoogleApiClient).setResultCallback(new ResultCallback<com.google.android.gms.common.api.Status>() { 
       @Override 
       public void onResult(com.google.android.gms.common.api.Status status) { 
        if (!status.getStatus().isSuccess()) { 
         Log.e("SYNCING", "ERROR" + status.getStatusMessage()); 
        } else { 
         Log.e("SYNCING", "SUCCESS"); 
         // execute async task to list AppFolderContents 
         new AppFolderContentsAsyncTask(getActivity()).execute(); 
        } 
       } 
      }); 

這非常適用於快速連續3/4的嘗試,但是我達到極限同步和狀態消息:

已超出ERRORSync請求速率限制。

有沒有什麼方法可以提高請求率,因爲如果我必須有一個應用程序提示用戶'請稍後再試以同步 - 不確定需要等待多久直到你可以!「

解決方案 - 各種各樣的,我的意念(什麼它的價值)

,我打算(發一封應用開發,其發佈的,如果沒有問題,同步驅動程序後)的解決方案是使用Drive REST Api,而不是新的(和Google首選的)Drive API。我試圖限制'requestSync',只有當用戶導航到帶有Drive選項的片段(而不是每個文件事務)時。但是,這大概會解決請求同步速率限制,但它仍可能達到此限制。此外,如果多個設備上運行的應用程序,並鏈接到同一硬盤帳戶都是同步/上傳/在應用中,同時刪除文件再有就是失去同步的可能性 - 也許是罕見的場景,但還是可以的。我不覺得讓用戶等待文件同步是用戶體驗或應用程序設計方面可行的選擇。

好奇,但 - 實際雲端硬盤應用可以刷新(?requestSync)多次,只要你喜歡。我在創建每個文件夾後,快速連續創建了20個文件夾,我刷新了手機上的雲端硬盤應用程序,並同步了所有20次。Google似乎明白同步的重要性,但選擇在新的Drive API中確保這一點非常困難。如前所述,將文件上傳到雲存儲通常是立即發生的(它是排隊的,但是如果連接起來,它幾乎是直接發生的)。我認爲這是在移動數據/更新驅動器內容方面的代價高昂的事務,而不僅僅是查詢文件的同步。但是,您可以一次添加一個文件到您的驅動器應用程序,並且幾乎立即一次上傳它們 - 在30秒內請求同步超過4次,然後失敗,您必須「冷靜」 ' 一段時間。

我對編程/ Android一般都很陌生 - 一旦我學到新東西,就會意識到自己實際上知道得有多少,所以如果他們是使用Drive API的更好解決方案(而不是REST API )我非常歡迎它。

+1

嗨,其實我們遇到了不同的情況。舊的REST API需要Android 6中的運行時GET_ACCOUNTS權限 - http://stackoverflow.com/q/34639890/72437我們正在從REST API轉向Google-drive-android-api。但是,目前面臨同樣的問題,因爲你... –

+0

@CheChe Yan Cheng我正在使用這個項目,我暫時擱置,因爲我試圖學習和獲得更多的一般經驗,而不是陷入困境與API的微妙之處。我無法想象一個簡單的解決方案,可以快速連續發生多設備同步,而不會觸及「同步限制」。在我的應用程序中有一個「同步按鈕」一旦按下就會變爲非活動狀態30秒,阻止進一步同步以避免限制不能與我坐在一起,或者等待避免限制的「正在等待」同步。有趣的是,駕車應用程序如何隨意多次同步! –

+0

我可以知道您點擊requestSync的速度有多快?你還記得,你每分鐘要做多少次請求來達到配額? –

回答

6

DriveApi#requestSync將允許您請求從服務器到設備的「同步關閉」。這樣,在第二臺設備上,您應該能夠看到從第一臺設備上傳的內容。但是,請求同步的呼叫受到速率限制(每設備)以避免濫用,並保證Drive API的合理數據使用量。理想情況下,您只需在需要時調用請求同步。無法提高費率限制。

關於上傳完成,提交上傳後,您不應該使用請求同步,因爲這不會幫助您(它只會同步下來,但不會)。實際上傳將盡快發生(基於設備的連接性以及您的應用通過DrivePreferencesApi指定的首選項,默認情況下這些首選項不受限制)。

如果您想知道實際上傳發生的時間,可以使用CompletionEvents。通過這種方式,您可以對實際進行的更多見解進行測試。

+0

謝謝,非常有幫助的信息 - 我已經想出了幾條可以解決此問題的路線,並且正在研究您提到的幾點以上。 –

+0

@MarkKeen你介意分享哪些路線,你最後做了什麼? – sorianiv

+0

@sorianiv - 請參閱原始問題中的編輯 - 各種解決方案。 –