gpt4 book ai didi

android - 我可以将自定义对象发送到 Android Wear 吗?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:39:33 25 4
gpt4 key购买 nike

我刚刚学习如何为 Android Wear 进行开发,我已经为智能 watch 创建了一个全屏 Activity,并且在应用程序的移动部分我获取了一些 JSON 数据并从中创建了一个自定义对象列表。

在我的移动应用程序中,我在 ListView 中显示这些对象的信息。

在我的应用程序的 Wear 部分,我想显示此列表的一个有限版本,例如,列表中的前 3 个将显示在我的可穿戴设备上的全屏应用程序中。

我的问题是似乎没有办法将 Parcelable 对象发送到 Android Wear,没有在 DataItem 中放置 Parcelable 的选项。

看起来唯一的选择是以字节为单位发送对象,如下所示:

public void sendWearableData(GoogleApiClient aGoogleApiClient, ArrayList<MyObject> myObjectList, String path)
{

googleApiClient = aGoogleApiClient;

byte[] testBytes = new byte[0];

if (googleApiClient.isConnected()) {
PutDataMapRequest dataMapRequest = PutDataMapRequest.create(path);
try {
testBytes = BytesUtils.toByteArray(myObjectList);
} catch (IOException e) {
e.printStackTrace();
}
dataMapRequest.getDataMap().putByteArray(Constants.TEST_KEY, testBytes);
PutDataRequest request = dataMapRequest.asPutDataRequest();
Wearable.DataApi.putDataItem(googleApiClient, request);
}
}

所以我必须将我的对象转换为字节,将它发送到 Android Wear 并将其转换回来?这意味着我已经在其上实现了 Parcelable 以便我可以通过 Intents 发送它们的对象现在也需要实现 Serializable,这是正确的还是有更好的方法?

最佳答案

bundle 式解决方案:

在我的应用程序中,我创建了一个轻量级类,专门用于将其从手机发送到 watch 。由于代码在应用程序的移动部分和可穿戴部分之间共享,因此可以在两种设备上轻松打包和恢复,而无需重复代码。它提供了类似Bundle的机制,但是使用了DataMap

示例实现:

public class MyObject {

public final long itemId;
public final long sortOrder;
public final String priceString;

public MyObject(long itemId, long sortOrder, String priceString) {
this.itemId = itemId;
this.sortOrder = sortOrder;
this.priceString = priceString;
}

public MyObject(DataMap map) {
this(map.getLong("itemId"),
map.getLong("sortOrder"),
map.getString("priceString")
);
}

public DataMap putToDataMap(DataMap map) {
map.putLong("itemId", itemId);
map.putLong("sortOrder", sortOrder);
map.putString("priceString", priceString);
return map;
}
}

编写这样的类可以让您考虑设备之间实际需要发送的内容,以尽可能少地发送。它也不会在添加或删除任何字段时中断(与下一个解决方案相反)。

回答您对 Parcelable 的疑虑:

如果您不想编写新类并想重用您现有的代码,您可以尝试使用下面的代码。它会让您只使用 Parcelable 接口(interface)(无需实现 Serializable 接口(interface))。我没有在跨设备发送时测试过它,但它成功地将 marshall()unmarshall() 字节数组发送到/从 Parcel 并将其存储在 DataMap.

注意:我不知道 Google Play 服务如何保存所有这些 DataApi 数据,但我担心更新此类时可能会出现问题.
例如,类将在 Android Wear 上更新,用户将启动应用程序,尝试从 DataApi 读取当前数据(使用此类的旧版本“序列化”)并尝试读取它来自 byte[] 就好像它是更新版本一样。应该测试这些问题,但我认为它们使 DataApi 如此原始“只是因为”或使在 Wear 上开发应用程序变得更加困难。

我强烈建议使用类似Bundle的解决方案,不要使用Parcelable解决方案。
使用它需要您自担风险。

import android.os.Parcel;
import android.os.Parcelable;

import com.google.android.gms.wearable.DataMap;

/**
* <p>Allows to put and get {@link Parcelable} objects into {@link DataMap}</p>
* <b>USAGE:</b>
* <p>
* <b>Store object in DataMap:</b><br/>
* DataMapParcelableUtils.putParcelable(dataMap, "KEY", myParcelableObject);
* </p><p>
* <b>Restore object from DataMap:</b><br/>
* myParcelableObject = DataMapParcelableUtils.getParcelable(dataMap, "KEY", MyParcelableObject.CREATOR);
* </p>
* I do <b>not recommend</b> to use this method - it may fail when the class that implements {@link Parcelable} would be updated. Use it at your own risk.
* @author Maciej Ciemięga
*/
public class DataMapParcelableUtils {

public static void putParcelable(DataMap dataMap, String key, Parcelable parcelable) {
final Parcel parcel = Parcel.obtain();
parcelable.writeToParcel(parcel, 0);
parcel.setDataPosition(0);
dataMap.putByteArray(key, parcel.marshall());
parcel.recycle();
}

public static <T> T getParcelable(DataMap dataMap, String key, Parcelable.Creator<T> creator) {
final byte[] byteArray = dataMap.getByteArray(key);
final Parcel parcel = Parcel.obtain();
parcel.unmarshall(byteArray, 0, byteArray.length);
parcel.setDataPosition(0);
final T object = creator.createFromParcel(parcel);
parcel.recycle();
return object;
}
}

代码也可以在 GitHub 上找到.

关于android - 我可以将自定义对象发送到 Android Wear 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25938273/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com