当前位置: 首页 > 面试题库 >

Android创建BitmapDescriptor异常

晏鸿畅
2023-03-14
问题内容

我正在编写一个可与​​google
map及其上的许多标记一起使用的应用程序。我的任务是在Google地图上创建并显示一些标记。标记中包含自定义图像和文本。数据正在从服务器加载,每当用户移动Google
Map Camera时,我就需要显示新的数据量。所以我正在使用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种不同的异常:

  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似乎无法创建Bitmap。因此,如果GC没有执行任务并且您没有足够的内存,您将收到此异常。就我而言,这很常见,因为每次用户移动Google地图摄像头时,我都需要生成大约10-20个标记。

首先,不要像我一样愚蠢,不要只为IconGenerator使用android-maps-utils
:)我编写了自己的类,该类从Bitmap生成BitmapDescriptor并将其缓存在LruCache中。这是缓存位图的好教程。您可以对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平台提供了许多可以使用的异常类 - 或者您可以编写自己的异常类。 如果您对任何以下问题回答“是”,您应该编写自己的异常类;否则,你可以使用别人的。 你需要一个Java平台中没有表示的异常类型吗? 如果用户能够区分你的异常与由其他供应商编写的类抛出的异常吗? 你的代码是否抛出不止一个相关的异常? 如果您使用他人的例外,用户是否可以访

  • 使用API 5.0+为创建图标时,google maps的有问题 用于创建的方法:

  • 在尝试调用SimpleDateFormat构造函数时,我得到了一个未捕获的异常: 堆栈跟踪是: 02-15 15:55:31.999 276 69-27669/com.clackityClack.parseProject W/DalvikVM:ThreadId=1:线程退出未捕获异常(Group=0x40E76300)02-15 15:55:32.077 276 69-27669/com.clac

  • 问题内容: 我正在尝试创建一个xml文件。当我创建该文件时,出现此错误。我真的不知道它是什么。这是一个非常奇怪的错误。文件创建正确,但是里面没有任何内容。 这是我用来创建xml文件的代码: 我在transfomer method中遇到了异常。知道我得到了什么错误吗? 问题答案: 这是某种配置问题,是由于您在编译代码时与在运行时在类路径上的代码不同而在类路径上使用了不同的JAR所致。

  • 我不知道如何解决这个问题。。。你能帮帮我吗? 我得到这个exeption: 我的代码是: 导入com.gargoylesoftware.htmlunit.WebClient; WebClient wb=new WebClient();}

  • 我正在尝试使用Apache POI3.14库创建文档。 当我尝试用这个重新编译的.jar运行应用程序时,我会得到这样的警告,但即便如此,它还是会被启动到设备上 那么在我的代码中尝试执行以下操作时: 我得到这个异常并关闭应用程序