【发布时间】:2017-02-07 13:02:27
【问题描述】:
我从智能手表收到一个 DataMap 对象,其中包含两个 DataMap 对象,一个包含字符串列表(标题、副标题、内容...),另一个包含资产列表
List<DataMap> rootItemDataMap [...]
DataMap itemFieldsDataMap = rootItem.getDataMap(Constants.ROOT_ITEM_FIELDS);
DataMap itemImagesDataMap = rootItem.getDataMap(Constants.ROOT_ITEM_IMAGES);
当 onDataChanged 被调用时,我将 itemFieldDataMap 转换为字符串,并将 itemImagesDataMap 转换为资产列表。对于每个资产,我想将资产转换为位图并将其放入位图列表中。但我有一个 OutOfMemoryError:
List<Bitmaps> imagesList = new ArrayList<>();
for (int j = 0; j < itemImagesDataMap.size(); j++) {
Asset asset = itemImagesDataMap.getAsset(Constants.EXTRA_IMAGE +j);
Bitmap bitmap = WearableUtils.loadBitmapFromAsset(mGoogleApiClient, asset);
imagesList.add(bitmap);
}
做得不好的方法是 loadBitmapFromAsset:
public static Bitmap loadBitmapFromAsset(GoogleApiClient mGoogleApiClient, Asset asset) {
InputStream assetInputStream = Wearable.DataApi.getFdForAsset(mGoogleApiClient, asset).await().getInputStream();
return BitmapFactory.decodeStream(assetInputStream);
}
我在运行时得到这个异常:
java.lang.OutOfMemoryError: Failed to allocate a 2531852 byte allocation with 1037608 free bytes and 1013KB until OOM
at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
at android.graphics.BitmapFactory.decodeStreamInternal(BitmapFactory.java:635)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:611)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:649)
at com.mangomobi.showtime.contentmanager.WearableUtils.loadBitmapFromAsset(WearableUtils.java:71)
at com.mangomobi.showtime.contentmanager.ItemFactoryImpl.createItems(ItemFactoryImpl.java:48)
at com.mangomobi.showtime.contentmanager.WearableContentServiceImpl.onDataChanged(WearableContentServiceImpl.java:136)
at com.google.android.gms.wearable.WearableListenerService$zzc$1.run(Unknown Source)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at com.google.android.gms.wearable.WearableListenerService$zzb.dispatchMessage(Unknown Source)
at android.os.Looper.loop(Looper.java:148)
at android.os.HandlerThread.run(HandlerThread.java:61)
我已经尝试过使用 BitmapFactory.Options,但我读到了这个SkImageDecoder::Factory returned null
在我的 WearList 中正确显示图像的唯一方法是获取收到的每个项目的第一张图像,因为 itemImagesDataMap 仅包含一个资产。 如何在 for 循环中加载多个位图而不会在 Android Wear 中出现内存错误,一般来说,在 Android 中?
【问题讨论】:
-
您是否在将图像发送到手表之前将其缩放到合适的尺寸?
-
不行,因为我不知道如何根据手表分辨率动态确定图片合适的大小。
-
要么只是猜测(例如,400px),要么使用数据 API 将尺寸从手表发送到手机。
-
好的。为什么要使用 DataApi?如何获得尺寸?
-
Data API 是为在两个设备之间传递数据而构建的,因此将屏幕尺寸从手表共享到手机可能是正确的选择。如果您对此更满意,Message API 也可以使用。至于获取大小:
DisplayMetrics metrics = getResources().getDisplayMetrics(); displaySize = new Point(metrics.widthPixels, metrics.heightPixels);
标签: java android wear-os android-bitmap android-wear-data-api