2012-10-18 62 views
5

我想直接在GCM(Google Cloud Message)中嵌入數據,以幫助我的應用程序跳過我的服務器。谷歌表示,總數據有效載荷需要適合4kb以內。數據使用[鍵,值]對發送。假設我做了這樣的事情:我如何知道我的GCM消息是否足夠小(<4kb)發送? (如何獲取字符串的大小?)

String key = "key"; 
String data = "data"; 
Message message = new Message.Builder().addData(key, data).build(); 
sender.send(message, regId, 5); 

我怎麼能知道,如果String data小於4KB?據我所知,沒有辦法真正做String.getSize()或類似的。

鏈接到的文檔,如果好奇: http://developer.android.com/training/cloudsync/gcm.html#embed

+0

對不起,我的意思是Google的文檔直接向GCM解釋嵌入數據。 –

+0

我認爲您正在尋找[this](http://developer.android.com/guide/google/gcm/server-javadoc/com/google/android/gcm/server/Message.html)。請注意,您必須查看靜態類[Message.Builder](http://developer.android.com/guide/google/gcm/server-javadoc/com/google/android/gcm/server/Message.Builder.html )爲addData()方法。 –

+0

E.G.如果使用[Sender.post(..)](http://developer.android.com/guide/google/gcm/server-javadoc/com/google/android/gcm/server/Sender.html#post%28java。 lang.String,%20java.lang.String%29)發送消息,注意它會拋出一個'IOException'。如果在消息太大的情況下拋出IOException,那麼問題的答案可能歸結爲「嘗試」它。 –

回答

5

您可以使用以下方法來得到字節的字符串:

String s = "some text here"; 
byte[] b = s.getBytes("UTF-8"); 
int bytes = b.length; 

讓sur e您指定String的編碼,因爲不同的編碼可能會佔用相同字符串的不同字節數。在上面的例子中,UTF-8被用作編碼。

要將字節轉換爲kB,只需除以1024即可。

編輯:Here's一個很好和詳細的回答,從Geobits的評論Java中的不同編碼的字節空間。

+1

有關不同編碼的示例:http://stackoverflow.com/a/4385653/752320 – Geobits

+1

由於鏈接到不同編碼的字節空間而被接受的答案。 –

3
int byteSize = data.length() * 2 // each char is 2 byte 

更新

int byteSize = data.getBytes("UTF-8").length // if you want to know the size in your desired encoding 
+1

這不適用於所有編碼。 –

+0

我讀過一個字符是Java中的2個字節,但是正如Raghav所說的那樣,似乎並不是100%真實的。我想這個答案可能會給我一個估計,但要100%,我必須找出編碼的類型,對嗎? –

+0

您可以設置要使用的編碼類型。看到我的答案。 –

0

我跑了幾個測試本地,好像在應用程序方面,你可以發送包含密鑰+值對約4020個字節的包你開始從GCM錯誤之前,而在服務器端這是一個多一點,大約4100字節。 考慮到這一點,爲了安全起見,我們決定在任何一方使用4,000字節。

相關問題