2012-10-18 4 views
5

Chcę osadzić dane bezpośrednio w GCM (Google Cloud Message), aby pomóc mojej aplikacji pominąć podróż w obie strony na mój serwer.Skąd mam wiedzieć, czy moja wiadomość GCM jest wystarczająco mała (<4kb) do wysłania? (Jak uzyskać rozmiar ciągu?)

Google twierdzi, że całkowita ładowność danych musi mieścić się w granicach 4 kb. Dane są wysyłane za pomocą par [klucz, wartość]. Zakładając, że zrobiłem coś takiego:

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

Skąd mogę wiedzieć, czy String data jest mniejsza niż 4kB? Według mojej wiedzy nie ma sposobu, aby naprawdę zrobić String.getSize() lub podobne.

Link do dokumentacji czy ciekawy: http://developer.android.com/training/cloudsync/gcm.html#embed

+0

Przepraszamy, miałem na myśli dokumentację Google wyjaśniającą osadzanie danych bezpośrednio w GCM. –

+0

Myślę, że szukasz [tego] (http://developer.android.com/guide/google/gcm/server-javadoc/com/google/android/gcm/server/Message.html). Zauważ, że musisz przyjrzeć się klasie statycznej [Message.Builder] (http://developer.android.com/guide/google/gcm/server-javadoc/com/google/android/gcm/server/Message.Builder.html) dla metody addData(). –

+0

E.G. Jeśli używasz [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), aby wysłać wiadomość, zauważ, że generuje 'wyjątek IOException'. Jeśli wyrzuci "wyjątek IOException" w przypadku zbyt dużej wiadomości, odpowiedź na pytanie może sprowadzić się do "spróbuj". –

Odpowiedz

5

można użyć następujących czynności, aby uzyskać bajty napisu:

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

Make sur e określasz kodowanie String, ponieważ różne kodowania mogą zajmować inną liczbę bajtów dla tego samego ciągu znaków. W powyższym przykładzie jako kodowanie użyto UTF-8.

Aby przekonwertować bajty na kB, wystarczy podzielić przez 1024.

EDYCJA: Here's miła i szczegółowa odpowiedź na temat przestrzeni bajtów różnych kodowań w Javie z komentarza Geobitsa.

+1

Przykłady różnych kodowań: http://stackoverflow.com/a/4385653/752320 – Geobits

+1

Zaakceptowana odpowiedź ze względu na łącze do przestrzeni bajtowej różnych kodowań. –

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

Updated

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

Nie dotyczy wszystkich kodowań. –

+0

Przeczytałem, że char był 2 bajty w Javie, ale jak Raghav powiedział, że nie wydaje się być w 100% prawdziwe. Myślę, że ta odpowiedź mogłaby mi dać oszacowanie, ale żeby być w 100%, musiałbym się dowiedzieć, jaki rodzaj kodowania, prawda? –

+0

Możesz ustawić typ kodowania, którego chcesz użyć. Zobacz moją odpowiedź. –

0

Przeprowadzam kilka testów lokalnie, wydaje się, że po stronie aplikacji można wysłać pakiet zawierający parę klucz + wartość około 4020 bajtów, zanim zaczniesz otrzymywać błąd z gcm, podczas gdy po stronie serwera jest to nieco więcej, około 4100 bajtów. Biorąc to pod uwagę, abyśmy mogli się bezpiecznie bawić, zdecydowaliśmy się na 4 000 bajtów po każdej stronie.