2012-10-18 7 views
5

Ich möchte Daten direkt in ein GCM (Google Cloud Message) einbetten, damit meine Anwendung eine Rundreise zu meinem Server überspringen kann.Woher weiß ich, ob meine GCM-Nachricht klein genug ist (<4kb), um gesendet zu werden? (Wie bekomme ich die Größe von String?)

Google sagt, dass die gesamte Datennutzlast in 4kb passen muss. Daten werden mit [Schlüssel, Wert] -Paaren gesendet. Angenommen, ich habe so etwas wie dies:

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

Wie kann ich wissen, ob die String data weniger als 4 kb? Nach meinem Wissen gibt es keine Möglichkeit, ein String.getSize() oder ähnliches zu tun.

Link zur Dokumentation, wenn neugierig: http://developer.android.com/training/cloudsync/gcm.html#embed

+0

Entschuldigung, ich meinte die Dokumentation von Google, die das Einbetten von Daten direkt in ein GCM erklärt. –

+0

Ich glaube, Sie suchen [this] (http://developer.android.com/guide/google/gcm/server-javadoc/com/google/android/gcm/server/Message.html). Beachten Sie, dass Sie sich die statische Klasse [Message.Builder] (http://developer.android.com/guide/google/gcm/server-javadoc/com/google/android/gcm/server/Message.Builder.html) ansehen müssen) für die Methode addData(). –

+0

E.G. Bei Verwendung von [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) um die Nachricht zu senden, beachten Sie, dass sie eine 'IOException' auslöst. Wenn es eine "IOException" im Falle einer zu großen Nachricht auslöst, kann die Antwort auf die Frage auf "probiere es" herunterkochen. –

Antwort

5

können Sie folgende verwenden, um die Bytes eines String zu erhalten:

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

Machen Sie sur e, dass Sie die Codierung der String angeben, da verschiedene Codierungen eine andere Anzahl von Bytes für denselben String belegen können. Im obigen Beispiel wird UTF-8 als Codierung verwendet.

Um die Bytes in kB zu konvertieren, teilen Sie einfach durch 1024.

EDIT: Here's eine schöne und detaillierte Antwort auf den Byte-Raum von verschiedenen Kodierungen in Java aus Geobits 'Kommentar.

+1

Beispiele für verschiedene Codierungen: http://StackOverflow.com/a/4385653/752320 – Geobits

+1

Akzeptierte Antwort wegen der Verbindung zu Byte-Raum von verschiedenen Codierungen. –

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

Aktualisiert

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

Dies gilt nicht für alle Kodierungen. –

+0

Ich habe gelesen, dass ein Char 2 Bytes in Java war, aber wie Raghav sagte, schien das nicht 100% wahr zu sein. Ich denke, diese Antwort könnte mir eine Schätzung geben, aber um 100% zu sein, müsste ich die Art der Kodierung herausfinden, richtig? –

+0

Sie können den Typ der Codierung festlegen, den Sie verwenden möchten. Siehe meine Antwort. –

0

Ich habe ein paar Tests lokal, scheint wie auf der Anwendungsseite können Sie ein Bündel senden, das ein Schlüssel + Wert-Paar von etwa 4020 Bytes enthält, bevor Sie einen Fehler von gcm bekommen, während auf der Serverseite es ist etwas mehr, etwa 4100 Bytes. Vor diesem Hintergrund haben wir beschlossen, mit 4.000 Bytes auf beiden Seiten zu spielen.