gpt4 book ai didi

java - Android 创建 BitmapDescriptor 异常

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:08:10 24 4
gpt4 key购买 nike

我正在编写一个应用程序,它可以与谷歌地图及其上的标记一起工作。我的任务是在谷歌地图上创建和显示一些标记。标记中包含自定义图像和文本。数据正在从服务器加载,每次用户移动谷歌地图相机时我都需要显示新的数据量。所以我使用 android-maps-utils:0.4.3 库来创建自定义位图(使用 IconGenerator),然后从中创建 BitmapDescriptor。以下是部分代码:

  googleMap.clear()

LayoutInflater layoutInflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

IconGenerator clusterIconGenerator = new IconGenerator(getActivity());
View clusterView = layoutInflater.inflate(R.layout.marker_cluster_view, null, false);
clusterIconGenerator.setContentView(clusterView);
clusterIconGenerator.setBackground(ContextCompat.getDrawable(getActivity(), R.drawable.mark_normal_grey));

List<Cluster> clusters = result.getResult(); // server data

for (Cluster cluster : clusters) {
Bitmap bitmap = clusterIconGenerator.makeIcon(String.valueOf(cluster.getOffersCount()));

Marker marker = googleMap.addMarker(new MarkerOptions()
.position(new LatLng(cluster.getLocation().getLatitude(), cluster.getLocation().getLongitude()))
.icon(BitmapDescriptorFactory.fromBitmap(bitmap)) // crash here
.anchor(0.5f, 0.5f));

markerClusterMap.put(marker, cluster);
}

一切正常,除了应用程序有时(不经常)崩溃,有 2 个不同的异常(exception):

  java.lang.RuntimeException: Could not copy bitmap to parcel blob.
at android.graphics.Bitmap.nativeWriteToParcel(Native Method)
at android.graphics.Bitmap.writeToParcel(Bitmap.java:1541)
at com.google.android.gms.maps.model.a.c.a(:com.google.android.gms:237)
at com.google.android.gms.maps.internal.h.a(:com.google.android.gms:227)
at com.google.android.gms.maps.internal.j.a(:com.google.android.gms:183)
at com.google.android.gms.maps.internal.CreatorImpl.a(:com.google.android.gms:32)
at com.google.android.gms.maps.internal.b.a(:com.google.android.gms:227)
at com.google.android.gms.maps.model.a.b.onTransact(:com.google.android.gms:106)
at android.os.Binder.transact(Binder.java:387)
at com.google.android.gms.maps.model.internal.zza$zza$zza.zzc(Unknown Source)
at com.google.android.gms.maps.model.BitmapDescriptorFactory.fromBitmap(Unknown Source)
at com.cheapsta.cheapsta.fragments.GoogleMapFragment.clustersLoadingFinished(GoogleMapFragment.java:187)

有时

java.lang.RuntimeException: Could not allocate dup blob fd.
at android.graphics.Bitmap.nativeCreateFromParcel(Native Method)
at android.graphics.Bitmap.-wrap0(Bitmap.java)
at android.graphics.Bitmap$1.createFromParcel(Bitmap.java:1516)
at android.graphics.Bitmap$1.createFromParcel(Bitmap.java:1515)
at maps.bx.a$a.onTransact(:com.google.android.gms.alldynamite:101)
at android.os.Binder.transact(Binder.java:387)
at com.google.android.gms.maps.model.a.c.a(:com.google.android.gms:242)
at com.google.android.gms.maps.internal.h.a(:com.google.android.gms:227)
at com.google.android.gms.maps.internal.j.a(:com.google.android.gms:183)
at com.google.android.gms.maps.internal.CreatorImpl.a(:com.google.android.gms:32)
at com.google.android.gms.maps.internal.b.a(:com.google.android.gms:227)
at com.google.android.gms.maps.model.a.b.onTransact(:com.google.android.gms:106)
at android.os.Binder.transact(Binder.java:387)
at com.google.android.gms.maps.model.internal.zza$zza$zza.zzc(Unknown Source)
at com.google.android.gms.maps.model.BitmapDescriptorFactory.fromBitmap(Unknown Source)
at com.cheapsta.cheapsta.fragments.GoogleMapFragment.clustersLoadingFinished(GoogleMapFragment.java:187)

我能用它做什么?我想我在创建 BitmapDescriptors 时用了太多内存。如果用户移动相机太多,每 3 秒将近 20 个 BitmapDescriptos。我应该以某种方式缓存它吗?非常感谢您的回答和时间!

最佳答案

这就是我得到的。看起来如果 BitmapFactory 没有足够的内存就无法创建位图。因此,如果 GC 没有完成工作并且您没有足够的内存,您将得到这个异常。在我的例子中,这很常见,因为每次用户移动谷歌地图相机时我都需要生成大约 10-20 个标记。

首先,不要像我一样愚蠢,不要只为 IconGenerator 使用 android-maps-utils :) 我编写了自己的类,从 Bitmap 生成 BitmapDescriptor 并将其缓存在 LruCache 中。 Here's good tutorial用于缓存位图。您可以对 BitmapDescriptor 执行几乎相同的操作。注意 LruCache 的大小。您无法以字节为单位获取 BitmapDescriptor 大小,因此您需要考虑 LruCache 中这些对象的数量。只需查看您的位图大小并进行一些计算即可。

如果您需要图片中的文字,请执行以下操作:

Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.mark_active_grey).copy(Bitmap.Config.ARGB_8888, true);

Canvas canvas = new Canvas(bitmap);
canvas.drawText(offersCount,
canvas.getWidth()/2,
canvas.getHeight()/2 - ((clustersPaint.getFontMetrics().ascent + clustersPaint.getFontMetrics().descent) / 2) ,
clustersPaint);

抱歉英语不好,我希望这些信息对某些人有用。

关于java - Android 创建 BitmapDescriptor 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36842011/

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