Android 将JSON数据传送到可穿戴设备的有效方法
我试图从一个JSON对象形式的URL读取一个提要,并将该提要传递给一个可穿戴设备,以便使用数据API显示为列表。这个JSON对象包含一个对象数组,每个对象包含几个元素。大概是这样的:Android 将JSON数据传送到可穿戴设备的有效方法,android,json,gson,wear-os,android-wear-data-api,Android,Json,Gson,Wear Os,Android Wear Data Api,我试图从一个JSON对象形式的URL读取一个提要,并将该提要传递给一个可穿戴设备,以便使用数据API显示为列表。这个JSON对象包含一个对象数组,每个对象包含几个元素。大概是这样的: { "items":[ { "title":"item 1", "element_1":"element 1", "element_2":"element 2" } { "title":"item 2", "element_1":"element 1", "element_2":"element 2
{ "items":[
{ "title":"item 1", "element_1":"element 1", "element_2":"element 2" }
{ "title":"item 2", "element_1":"element 1", "element_2":"element 2" }
{ "title":"item 3", "element_1":"element 1", "element_2":"element 2" }
]}
我可以使用GSON或Jackson(虽然我想我更喜欢GSON)将这些项目放入对象的
ArrayList
,但我不知道如何才能将对象的ArrayList
放入可穿戴设备。据我所知,我不能。我想知道是否有办法做到这一点,如果没有,我应该如何做的一些最佳做法?我是否应该将JSON作为字符串获取,将字符串传递给可穿戴设备,然后对其进行解析?但是,考虑到我不知道JSON对象列表会有多大,我不知道如果字符串非常大,这是否是低效的。我也知道可以使用GSON解析字符串,但我不知道这是否也是低效的。一般建议是向可穿戴设备发送它所需的最小数据,并在手持设备上进行最大处理,因为它具有更大的处理能力(和电池)。根据文件:
当前最大数据项大小限制约为100k。数据项通常应远小于此限制。
如果可以接收到非常大的JSON,您可以在手持设备端对其进行拆分,或者可以过滤其中的一些数据 如果您认为您的案例不可能做到这一点,那么您可能应该修改您的要求
我直接在可穿戴设备上使用GSON处理JSON,就我的使用案例而言,它已经足够好了。我找到了Android Wear示例,这是我当前基于该示例的代码。首先,我创建了一个共享库来减少重复代码。此共享库包含保存JSON数据的
项
类。我在手持设备上的DownloadArrayListTask
中使用这个类,它从输入流中获取JSON对象,并将数据放入项的ArrayList
中
@Override
protected ArrayList<Item> doInBackground(URL... params) {
URL url = params[0];
ArrayList<Item> items = new ArrayList<>();
try {
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
try {
InputStreamReader input = new InputStreamReader(connection.getInputStream());
Type listType = new TypeToken<Map<String, ArrayList<Item>>>(){}.getType();
Gson gson = new GsonBuilder().create();
Map<String, ArrayList<Item>> treeMap = gson.fromJson(input, listType);
items = treeeMap.get("items");
input.close();
} finally {
connection.disconnect();
}
} catch (IOException exception) {
exception.printStackTrace();
}
return items
}
@Override
protected ArrayList<Item> doInBackground(Uri... params) {
Uri uri = params[0];
ArrayList<Item> items = new ArrayList<>();
GoogleApiClient googleApiClient = new GoogleApiClient.Builder(this)
.addApi(Wearable.API).build();
ConnectionResult connectionResult = googleApiClient.blockingConnect(30, TimeUnit.SECONDS);
if(!connectionResult.isSuccess()) {
Log.e(TAG, "Failed to connect to Google API Client");
return;
}
DataItemBuffer results = Wearable.DataApi.getDataItems(googleApiClient).await();
if(results.getStatus().isSuccess() && results.getCount() != 0) {
DataMapItem dataMapItem = DataMapItem.fromDataItem(results.get(0);
List<DataMap> data = dataMapItem.getDataMap().getDataMapArrayList("item_key");
for(DataMap dataItem : data) {
Item item = new Item(dataItem.getString("title"),
dataItem.getString("element1"),
dataItem.getString("element2"));
items.add(item);
}
} else {
Log.d(TAG, "Failed to obtain data");
} return items;
}
然后,可穿戴设备接收DataMap
对象的ArrayList
,并使用其自己的AsyncTask
将它们放回项目的ArrayList
中
@Override
protected ArrayList<Item> doInBackground(URL... params) {
URL url = params[0];
ArrayList<Item> items = new ArrayList<>();
try {
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
try {
InputStreamReader input = new InputStreamReader(connection.getInputStream());
Type listType = new TypeToken<Map<String, ArrayList<Item>>>(){}.getType();
Gson gson = new GsonBuilder().create();
Map<String, ArrayList<Item>> treeMap = gson.fromJson(input, listType);
items = treeeMap.get("items");
input.close();
} finally {
connection.disconnect();
}
} catch (IOException exception) {
exception.printStackTrace();
}
return items
}
@Override
protected ArrayList<Item> doInBackground(Uri... params) {
Uri uri = params[0];
ArrayList<Item> items = new ArrayList<>();
GoogleApiClient googleApiClient = new GoogleApiClient.Builder(this)
.addApi(Wearable.API).build();
ConnectionResult connectionResult = googleApiClient.blockingConnect(30, TimeUnit.SECONDS);
if(!connectionResult.isSuccess()) {
Log.e(TAG, "Failed to connect to Google API Client");
return;
}
DataItemBuffer results = Wearable.DataApi.getDataItems(googleApiClient).await();
if(results.getStatus().isSuccess() && results.getCount() != 0) {
DataMapItem dataMapItem = DataMapItem.fromDataItem(results.get(0);
List<DataMap> data = dataMapItem.getDataMap().getDataMapArrayList("item_key");
for(DataMap dataItem : data) {
Item item = new Item(dataItem.getString("title"),
dataItem.getString("element1"),
dataItem.getString("element2"));
items.add(item);
}
} else {
Log.d(TAG, "Failed to obtain data");
} return items;
}
@覆盖
受保护的ArrayList doInBackground(Uri…参数){
Uri=params[0];
ArrayList items=新建ArrayList();
GoogleAppClient GoogleAppClient=新的GoogleAppClient.Builder(此)
.addApi(Wearable.API).build();
ConnectionResult ConnectionResult=GoogleAppClient.blockingConnect(30,时间单位为秒);
如果(!connectionResult.isSuccess()){
Log.e(标记“未能连接到Google API客户端”);
返回;
}
DataItemBuffer results=Wearable.DataApi.getDataItems(GoogleAppClient.await();
if(results.getStatus().issucess()&&results.getCount()!=0){
DataMapItem DataMapItem=DataMapItem.fromDataItem(results.get(0);
列表数据=dataMapItem.getDataMap().getDataMapArrayList(“项_键”);
对于(DataMap dataItem:data){
Item Item=新项目(dataItem.getString(“标题”),
dataItem.getString(“element1”),
getString(“element2”);
项目。添加(项目);
}
}否则{
Log.d(标记“未能获取数据”);
}退货项目;
}
可穿戴设备应该接收完整的项目列表,还是只接收其中的一部分?@helleye是的,是完整的项目列表。您通过将数据作为消息发送,然后使用@krishnan作为消息发送,我认为在我的情况下,这将是非常低效的,因为JSON数组中的一些项目将在一段时间内保持静态。从据我所知,DataApi可以存储这些数据,以便可穿戴设备在更新列表时只提取更多数据。我目前实现这一点的方法是让可穿戴设备在打开手持设备时向其发送消息以更新数据,然后可穿戴设备监听此更新。如果数据不变,则可穿戴设备不会承受任何压力le.如果我一直在发送信息,那么可穿戴设备就一直在使用宝贵的资源。嘿,一个附带的问题。你以后(穿着时)会如何处理这些物品?您是否将它们存储在本地数据库中,或者您以某种方式导致它们在下一次启动wear app时从掌上电脑重新发送?@DennisK当前,每次启动app时,我都会向掌上电脑发送一条消息以重新同步数据。我没有尝试保存到本地数据库,因为我收到的信息只有在当前状态下才相关nt。您应该能够将其保存到可穿戴设备上的本地数据库中,尽管我不太熟悉wear平台的限制。您是通过MessageClient还是通过smth其他方式发送它?@pushandpop不幸的是,我不记得我使用了什么,我没有访问该源代码的权限,我不再为Android开发:)