Android 折线绘制上的 ArrayIndexOutOfBounds

2024-03-07

我正在使用谷歌地图精简版模式,在其中绘制多边形线和标记联想K50a40我收到以下错误

  **Non-fatal Exception: java.lang.ArrayIndexOutOfBoundsException: length=42; index=42**
   at maps.ah.k.a(Unknown Source:4000)
   at maps.ah.k.a(Unknown Source)
   at maps.ah.k.a(Unknown Source)
   at maps.ah.i.a(Unknown Source)
   at maps.ah.d.onDraw(Unknown Source)
   at android.view.View.draw(View.java:16457)
   at android.view.View.buildDrawingCacheImpl(View.java:15722)
   at android.view.View.buildDrawingCache(View.java:15576)
   at android.view.View.draw(View.java:16204)
   at android.view.ViewGroup.drawChild(ViewGroup.java:3746)
   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3536)
   at android.view.View.updateDisplayListIfDirty(View.java:15402)
   at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3730)
   at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3710)
   at android.view.View.updateDisplayListIfDirty(View.java:15361)
   at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3730)
   at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3710)
   at android.view.View.updateDisplayListIfDirty(View.java:15361)
   at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3730)
   at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3710)
   at android.view.View.updateDisplayListIfDirty(View.java:15361)
   at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3730)
   at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3710)
   at android.view.View.updateDisplayListIfDirty(View.java:15361)
   at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3730)
   at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3710)
   at android.view.View.updateDisplayListIfDirty(View.java:15361)
   at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3730)
   at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3710)
   at android.view.View.updateDisplayListIfDirty(View.java:15361)
   at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3730)
   at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3710)
   at android.view.View.updateDisplayListIfDirty(View.java:15361)
   at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3730)
   at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3710)
   at android.view.View.updateDisplayListIfDirty(View.java:15361)
   at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3730)
   at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3710)
   at android.view.View.updateDisplayListIfDirty(View.java:15361)
   at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3730)
   at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3710)
   at android.view.View.updateDisplayListIfDirty(View.java:15361)
   at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3730)
   at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3710)
   at android.view.View.updateDisplayListIfDirty(View.java:15361)
   at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3730)
   at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3710)
   at android.view.View.updateDisplayListIfDirty(View.java:15361)
   at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3730)
   at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3710)
   at android.view.View.updateDisplayListIfDirty(View.java:15361)
   at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3730)
   at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3710)
   at android.view.View.updateDisplayListIfDirty(View.java:15361)
   at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3730)
   at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3710)
   at android.view.View.updateDisplayListIfDirty(View.java:15361)
   at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3730)
   at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3710)
   at android.view.View.updateDisplayListIfDirty(View.java:15361)
   at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3730)
   at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3710)
   at android.view.View.updateDisplayListIfDirty(View.java:15361)
   at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3730)
   at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3710)
   at android.view.View.updateDisplayListIfDirty(View.java:15361)
   at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:286)
   at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:292)
   at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:327)
   at android.view.ViewRootImpl.draw(ViewRootImpl.java:3024)
   at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2828)
   at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2440)
   at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1325)
   at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6741)
   at android.view.Choreographer$CallbackRecord.run(Choreographer.java:912)
   at android.view.Choreographer.doCallbacks(Choreographer.java:714)
   at android.view.Choreographer.doFrame(Choreographer.java:649)
   at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:898)
   at android.os.Handler.handleCallback(Handler.java:815)
   at android.os.Handler.dispatchMessage(Handler.java:104)
   at android.os.Looper.loop(Looper.java:207)
   at android.app.ActivityThread.main(ActivityThread.java:5769)
   at java.lang.reflect.Method.invoke(Method.java)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)

下面是我在谷歌地图上绘制路线的逻辑

 public static void drawRouteIntoMap(List<? extends MapHelper> position, final GoogleMap googleMap , final boolean removeMarker) {
        /*List<MapHelper> position = new ArrayList<MapHelper>();
        for (int i = lastPosition; i < maps.size(); i++) {
            position.add(maps.get(i));
        }*/
        if (position.size() > 0 && Validator.isNotNull(googleMap)) {
           // googleMap.clear();
            final List<? extends MapHelper> tempList=new ArrayList<>(position);
            if(tempList.size()!=pointList.size()) {
                tempList.removeAll(pointList);
            }

            List<PolylineOptions> polylineOptionses = new ArrayList<PolylineOptions>();
            PolylineOptions option = null;
            Boolean lastPause = null;
            for (MapHelper map : tempList) {
                if (map.isPause()) {
                    if (Validator.isNull(lastPause) || !lastPause) {
                        option = new PolylineOptions().width(5).color(Color.rgb(255, 0, 155)).geodesic(true);
                        polylineOptionses.add(option);
                    }
                    option.add(new LatLng(map.getLatitude(), map.getLongitude()));
                } else {
                    if (Validator.isNull(lastPause) || lastPause) {
                        option = new PolylineOptions().width(5).color(Color.rgb(0, 179, 253)).geodesic(true);
                        polylineOptionses.add(option);
                    }
                    option.add(new LatLng(map.getLatitude(), map.getLongitude()));
                }
                lastPause = map.isPause();
            }
            for (PolylineOptions options : polylineOptionses) {
                googleMap.addPolyline(options);
            }
            if(Validator.isNotNull(option)) {
                List<LatLng> points = option.getPoints();
                final LatLngBounds.Builder mapBounds = new LatLngBounds.Builder();
                for (LatLng latLng : points) {
                    mapBounds.include(latLng);
                }

                googleMap.setOnMapLoadedCallback(new GoogleMap.OnMapLoadedCallback() {
                    @Override
                    public void onMapLoaded() {
                        if(removeMarker) {
                            if (Validator.isNotNull(endMarker)) {
                                startMarker.remove();
                                endMarker.remove();
                            }
                        }
                        LatLng startPoint = new LatLng(tempList.get(0).getLatitude(), tempList.get(0).getLongitude());
                        Marker marker1=googleMap.addMarker(new MarkerOptions().position(startPoint).title("start").icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN)));
                        LatLng endPoint = new LatLng(tempList.get(tempList.size() - 1).getLatitude(), tempList.get(tempList.size() - 1).getLongitude());
                        Marker marker2=googleMap.addMarker(new MarkerOptions().position(endPoint).title("finish").icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)));
                        googleMap.moveCamera(CameraUpdateFactory.newLatLngBounds(mapBounds.build(), 10));
                        googleMap.animateCamera(CameraUpdateFactory.newLatLngBounds(mapBounds.build(), 10));
                        googleMap.moveCamera(CameraUpdateFactory.zoomOut());
                        startMarker=marker1;
                        endMarker=marker2;

                    }
                });

                pointList = position;

            }

        }
    }

我在其中进行测试的设备仅发生在 lenovo k50a40 型号中,我无法找出实际原因,需要任何帮助。


为什么会崩溃?

通过查看异常,一切都表明您错误地遍历了数组(或列表)。

检查主要信息

java.lang.ArrayIndexOutOfBoundsException:长度=42;索引=42

弄清楚接下来会发生什么更加棘手,主要是因为我们没有有关代码的任何信息:

   at maps.ah.k.a(Unknown Source:4000)
   at maps.ah.k.a(Unknown Source)
   at maps.ah.k.a(Unknown Source)
   at maps.ah.i.a(Unknown Source)

为什么它可以在其他一些设备上运行?

不同的 Android 设备具有不同的软件基础和硬件基础(取决于制造它们的公司),因此人们可能会在某些时候看到不同的行为。

因此,即使其他设备可以处理非致命异常,但联想K50a40似乎无法处理。或者甚至可能是联想系统设计错误,无从得知。

我该怎么办?

你无能为力。 我帮助您找到路径的解决方案是:

  1. 将控制台日志放置在尽可能多的地方。
  2. 删除尽可能多的逻辑并一点一点地添加,直到找到破坏它的东西。
  3. 去除forEach在java中并强制常规for (int i = 0; i < maps.size(); i++)我可以在任何地方循环,并监视i.

代码评估

这就是说,有些东西我不太能从你的代码中得到。

if (map.isPause()) {
    if (Validator.isNull(lastPause) || !lastPause) {
        option = new PolylineOptions().width(5).color(Color.rgb(255, 0, 155)).geodesic(true);
        polylineOptionses.add(option);
    }
    option.add(new LatLng(map.getLatitude(), map.getLongitude()));
} else {
    if (Validator.isNull(lastPause) || lastPause) {
        option = new PolylineOptions().width(5).color(Color.rgb(0, 179, 253)).geodesic(true);
        polylineOptionses.add(option);
    }
    option.add(new LatLng(map.getLatitude(), map.getLongitude()));
}

如果发生什么情况map.isPause()返回 true 并且Validator.isNull(lastPause) || !lastPause返回假?

如果我理解正确的话,你就会跑步option.add(new LatLng(map.getLatitude(), map.getLongitude()));在空对象上。

这将导致空异常。

你能提供一些背景吗pointList多变的?


我知道这可能不是您所希望的,但我仍然希望它能有所帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 折线绘制上的 ArrayIndexOutOfBounds 的相关文章

  • Android 上的多处理

    我一直在 Android 上执行一些测试 以验证并行化算法 如 FFT 的性能可以提高多少 我通过使用带有 JNI FFTW 的 pthread 和 Java 线程 来自 JTransforms 来实现这些算法 我没有像预期那样通过使用线程
  • adb shell 输入带有空格的文本

    如何发送带有空格的文本 例如 一些文字 using adb shell input text 找到以下解决方案 adb shell input text some stext 工作正常 但是有什么简单的方法可以用 s 替换空格吗 Examp
  • 从ndk中的不同线程调用java方法

    我正在尝试使用 android 的 NDK 从 C 中的独立线程调用 java 静态方法 到目前为止我已经 JNIEnv env AttachJava jclass cls2 env gt FindClass com actvt showd
  • 如何检测手机一整圈(360 度)?

    由于我在网络上搜索没有找到任何相关答案 因此我发布了有关检测的问题360度转弯使用加速度计绕其轴的 Android 设备 例如 在横向模式下围绕 y 轴 假设在起始位置 y 值为 0 设备平坦于地面 当手机向前旋转 90 度时y 10 18
  • Android Studio 模拟器无法加载 Windows 10

    我在 Windows 10 上全新安装了 android studio 其中包含 android api 22 的所有软件包 当我运行模拟器时 我收到以下消息 C Users admin AppData Local Android sdk
  • React-Native 中的导航抽屉

    我是反应原生的新手 不介意我问一个基本问题 我想知道 实现抽屉式导航的分步过程是什么 推荐链接这个链接 https github com react native community react native side menu usage
  • 使用 HashMap 映射 String 和 int

    我有一个显示国家 地区名称的列表视图 我已将名称作为字符串数组存储在 strings xml 中 称为国家 地区名称 在填充 ListView 时 我使用从 strings xml 读取的 ArrayAdapter String count
  • 为什么Android room不建议使用allowMainThreadQueries()?

    我正在创建一个小型应用程序 仅在数据库中保存一些计数器 如果不存在 请插入一个 如果是的话 增加更新 该应用程序没有任何用户界面 它是一个保存和读取数据 少量表 少量记录 的插件 我可以用吗允许主线程查询 在这种情况下 每次我读到一些关于这
  • Android 偏好设置中的“是”或“否”确认[重复]

    这个问题在这里已经有答案了 我需要在 设置 中实现 重置 选项 单击该设置后 将打开一个简单的对话框 要求确认 我看过了DialogPreference但我似乎无法在任何地方找到好的解决方案或教程 有人可以帮我吗 我是初学者 想法甚至代码都
  • 使用audioSessionId值实例化AudioFx类?

    我已经阅读了 Android API 并尝试在互联网上搜索有关声明自定义audioSessionId然后用它audioSessionId初始化 AudioFx 类并为我的 MediaPlayer 或 AudioTrack 分配硬编码audi
  • Google Play 服务,登录成功,但创建房间时出错

    我正在尝试 google play 服务示例 特别是 ButtonClicker2000 从 logcat 登录过程也正常 但我有另一个错误 06 01 22 43 15 478 D ButtonClicker2000 1565 Sign
  • Android TextView 中的等宽表格数字

    我有一个自定义字体 默认情况下具有可变宽度数字字形 并且我想在 Android 中使用该字体的等宽表格数字功能TextView使数字垂直对齐 也就是说 改变如下 像这样的事情 要选择字体的表格数字功能 请使用TextView s fontF
  • Horizo​​ntalScrollView 将 GridView 缩小为小行

    当我将 Horizo ntalScrollView 放在 GridView 周围时 GridView 会被压缩到左侧的一个小列中 Gridview 的垂直滚动条甚至出现在左侧 Horizo ntalScrollView 的宽度设置为 fil
  • 如何在我的谷歌上嵌入转弯导航

    我想在我的 Android 应用程序中嵌入逐段导航 请给我一个教程或如何执行此操作的想法 提前致谢 如果您不固定使用谷歌地图 您可以使用基于 OpenStreetMap 地图的维基百科版本 的 SDK 有几个不错的 SDK 提供商 skob
  • Android 中的 BLE Gatt onConnectionStateChanged 失败,状态为 257

    我正在开发一个同时连接到多个BLE设备的Android应用程序 之后我从这些设备永久读取特征 但过了一会儿 我在onConnectionStateChanged 函数中得到状态257 android文档没有解释错误的原因是什么 或者如何修复
  • 布局聊天气泡问题:TextView 占满整个屏幕

    我正在研究泡泡聊天 我使用具有两种布局的适配器 一种用于传入消息 另一种用于我的消息 适配器工作正常 我的问题在于传入布局 无法很好地显示传入时间文本 当消息文本增长时 会填满屏幕的整个宽度 并隐藏消息时间的文本 第一个问题 如何才能实现这
  • Google 的 Android OpenGL 教程是否教授了错误的线性代数?

    在帮助另一位用户解决有关该问题的问题后响应触摸事件 http developer android com training graphics opengl touch htmlAndroid教程 我下载了源代码 并且对我所看到的感到非常困惑
  • 通知管理器所需的权限

    我正在尝试使用以下命令将振铃器设置为静音且请勿打扰优先级 AudioManager myAudioMgr AudioManager context getSystemService Context AUDIO SERVICE Notific
  • Desire HD 中的应用程序崩溃

    由于某些莫名其妙的原因 我的应用程序在 HTC Desire HD 上崩溃了 它在其他手机和模拟器中运行良好 这是崩溃报告 java lang RuntimeException Unable to start activity Compon
  • android中如何将字符串转换为unicode

    我正在解析一些unicodes from json to my android应用程序 API 给出unicodes像这样的图标 ue600 当我将这个unicode直接添加到textview like textview setText u

随机推荐