我正在制作一款需要线性图的Android应用程序,因此我需要从服务器获取(x,y)坐标。
我们使用Ruby on Rails和Heroku构建后端(尽管我们也在考虑Google AppEngine)。
如何以最佳方式将数百个(x,y)坐标(编码为JSON?)发送到Android设备上?
我正在制作一款需要线性图的Android应用程序,因此我需要从服务器获取(x,y)坐标。
我们使用Ruby on Rails和Heroku构建后端(尽管我们也在考虑Google AppEngine)。
如何以最佳方式将数百个(x,y)坐标(编码为JSON?)发送到Android设备上?
如果你非常关注带宽,可以将坐标打包成二进制格式。例如,假设一个二维网格的 (x,y) 坐标为 32 位整数。使用 Ruby:
points = [[107897,598654], [876432,30001], [15,754689]]
# => [[107897, 598654], [876432, 30001], [15, 754689]]
# json size
points.to_json.length
# => 44
# make a byte stream of points
data = points.flatten.pack("V*")
# => "y\xA5\x01\x00~\"\t\x00\x90_\r\x001u\x00\x00\x0F\x00\x00\x00\x01\x84\v\x00"
# binary size
data.length
# => 24
# read a byte stream to points
points = data.unpack("V*").each_slice(2).to_a
# => [[107897, 598654], [876432, 30001], [15, 754689]]
由于您正在生成折线图,您可能想从Google Chart服务的简单和扩展text encodings中获得灵感。主要的收获是您不需要传输实际值;只需传输它们的相对值和限制即可。
<coordinate use='errorbar'>1,2</coordinate>
),在你的 Ruby 脚本中每个坐标都用新行分隔,并使用以下代码在 Android 上下载结果:public static String[] download(String web_url) throws IOException{
URL website = new URL(web_url);
BufferedReader in = new BufferedReader(
new InputStreamReader(
website.openStream()));
String input;
ArrayList<String> stringList = new ArrayList<String>();
while ((input = in.readLine()) != null) {
stringList.add(input);
}
String[] itemArray = new String[stringList.size()];
String[] returnedArray = stringList.toArray(itemArray);
return returnedArray;
}
// Of course, call this function with web_url as the URL to your script
这将为您提供XML输出,每行作为数组中的一个条目,然后您只需解析XML即可。如果您确定永远不需要额外的数据,您可以只发送纯文本,无需解析XML。
最好的方法可能是使用 JSON
或 XML
进行编码。