Android Sudoku应用挂掉的问题

在真机上测试数独游戏时发现,快速点击屏幕时,游戏偶尔出现挂死的情况,Log如下

04-08 15:35:00.838    7317-7356/org.elvalad.sudoku D/OpenGLRenderer﹕ Enabling debug mode 0
04-08 15:35:23.036    7317-7317/org.elvalad.sudoku E/InputEventReceiver﹕ Exception dispatching input event.
04-08 15:35:23.036    7317-7317/org.elvalad.sudoku E/MessageQueue-JNI﹕ Exception in MessageQueue callback: handleReceiveCallback
04-08 15:35:23.041    7317-7317/org.elvalad.sudoku E/MessageQueue-JNI﹕ java.lang.ArrayIndexOutOfBoundsException: length=81; index=83
            at org.elvalad.sudoku.GameView.onTouchEvent(GameView.java:282)
            at android.view.View.dispatchTouchEvent(View.java:8393)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2432)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2119)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2432)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2119)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2432)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2119)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2432)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2119)
            at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2314)
            at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1692)
            at android.app.Activity.dispatchTouchEvent(Activity.java:2749)
            at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2275)
            at android.view.View.dispatchPointerEvent(View.java:8583)
            at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4091)
            at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3957)
            at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3509)
            at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3562)
            at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3528)
            at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3638)
            at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3536)
            at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3695)
            at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3509)
            at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3562)
            at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3528)
            at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3536)
            at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3509)
            at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5806)
            at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5745)
            at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5716)
            at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5896)
            at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:192)
            at android.os.MessageQueue.nativePollOnce(Native Method)
            at android.os.MessageQueue.next(MessageQueue.java:143)
            at android.os.Looper.loop(Looper.java:122)
            at android.app.ActivityThread.main(ActivityThread.java:5312)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)
04-08 15:35:23.041    7317-7317/org.elvalad.sudoku D/AndroidRuntime﹕ Shutting down VM
04-08 15:35:23.042    7317-7317/org.elvalad.sudoku E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: org.elvalad.sudoku, PID: 7317
    java.lang.ArrayIndexOutOfBoundsException: length=81; index=83
            at org.elvalad.sudoku.GameView.onTouchEvent(GameView.java:282)
            at android.view.View.dispatchTouchEvent(View.java:8393)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2432)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2119)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2432)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2119)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2432)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2119)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2432)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2119)
            at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2314)
            at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1692)
            at android.app.Activity.dispatchTouchEvent(Activity.java:2749)
            at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2275)
            at android.view.View.dispatchPointerEvent(View.java:8583)
            at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4091)
            at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3957)
            at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3509)
            at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3562)
            at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3528)
            at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3638)
            at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3536)
            at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3695)
            at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3509)
            at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3562)
            at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3528)
            at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3536)
            at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3509)
            at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5806)
            at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5745)
            at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5716)
            at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5896)
            at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:192)
            at android.os.MessageQueue.nativePollOnce(Native Method)
            at android.os.MessageQueue.next(MessageQueue.java:143)
            at android.os.Looper.loop(Looper.java:122)
            at android.app.ActivityThread.main(ActivityThread.java:5312)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)

从Log中可以很容易的发现是数组越界了,说明我们在游戏中绘制游戏格子时坐标并不是完全正确的,一个简单的处理办法是我们在使用数组时添加保护机制,当数组的Index大于81时直接让这次touch屏幕动作无效即可。

时间: 2024-08-15 23:36:10

Android Sudoku应用挂掉的问题的相关文章

Android Sudoku第一版

经过几天的下班空闲时间写了一个android上的数独游戏,今天也申请了几个发布平台的账号,发布出去了,google play要收25刀,而且这个在大陆基本访问不上,所以暂时就没买.在移动平台写应用程序还蛮好玩的,感觉想要写个简单的应用简单,但是要用优雅的代码写出有趣的应用还是很难的.我最近有个新的点子,我一直想要个可以通过识别照片中的植物辨别是哪类植物并且能够给出详细介绍的手机app,之前见到过一款ios上通过植物叶子识别植物的应用,这个图像识别算法应该很好玩.

android.app.Activity阅读摘要,有时候会不会需要保持一些现场数据呢? 想让系统帮你退出到后台或者挂掉前做些前置保持工作吗,重点参考吧:

* * @param savedInstanceState If the activity is being re-initialized after * previously being shut down then this Bundle contains the data it most * recently supplied in {@link #onSaveInstanceState}. <b><i>Note: Otherwise it is null.</i>

Appium+Robotframework实现Android应用的自动化测试-7:模拟器频繁挂掉的解决方案

如果测试用例比较多,则当持续运行多个测试用例后,经常会出现模拟器崩溃或者Appium无法连接到该模拟器的情况出现. 经过分析,本人认为这应该是模拟器或者Appium的缺陷造成的,目前并没有直接的解决方案. 不过可以曲线救国,我的解决方案是:在开始测试时启动模拟器,在测试结束后关闭模拟器,这样虽然需要更多的时间,但这个问题确实不再出现了,时间有的是,可以让其在夜间自动启动执行就可以了. 在Settings中加入Process库,这个库是Robotframework自带的,写明即可. *** Set

android内存优化-1-内存泄露

1.资源对象没关闭造成的内存泄漏 描述: 资源性对象比如(Cursor,File文件等)往往都用了一些缓冲,我们在不使用的时候,应该及时关闭它们,以便它们的缓冲及时回收内存.它们的缓冲不仅存在于java虚拟机内,还存在于java虚拟机外.如果我们仅仅是把它的引用设置为null,而不关闭它们,往往会造成内存泄漏.因为有些资源性对象,比如SQLiteCursor(在析构函数finalize(),如果我们没有关闭它,它自己会调close()关闭),如果我们没有关闭它,系统在回收它时也会关闭它,但是这样

android产品研发(七)--&gt;Apk热修复

转载请标明出处:一片枫叶的专栏 去年一整年android社区中刮过了一阵热修复的风,各大厂商,逼格大牛纷纷开源了热修复框架,恩,产品过程中怎么可能没有bug呢?重新打包上线?成本太高用户体验也不好,咋办?上热修复呗. 好吧,既然要开始上热修复的功能,那么就得调研一下热修复的原理.下面我将分别讲述一下热修复的原理,各大热修复框架的比较,以及自身产品中热修复功能的实践. 热修复的原理 通过更改dex加载顺序实现热修复 最新github上开源了很多热补丁动态修复框架,大致有: HotFix      

【黑马Android】(04)数据库的创建和sql语句增删改查/LinearLayout展示列表数据/ListView的使用和BaseAdater/内容提供者创建

数据库的创建和sql语句增删改查 1. 加载驱动. 2. 连接数据库. 3. 操作数据库. 创建表: create table person( _id integer primary key, name varchar(20), age integer ); 添加: insert into person(name, age) values('lisi', 19); 删除: delete from person where _id = 1; 修改: update person set name =

linux chrome运行android应用方法

chromeos-apk 是一个可以讲android的apk程序包装成chrome可以运行的插件的工具.github的地址是: https://github.com/vladikoff/chromeos-apk 使用方法: 安装 npm install chromeos-apk -g 转换 chromeos-apk chrome 通过开发者模式来加载生成的插件 现在加载会不成功,因为chrome缺少 ARC 库,所以通过 https://bitbucket.org/vladikoff/archo

android 内存泄露调试

一.概述 1 二.Android(Java)中常见的容易引起内存泄漏的不良代码 1 (一) 查询数据库没有关闭游标 2 (二) 构造Adapter时,没有使用缓存的 convertView 3 (三) Bitmap对象不在使用时调用recycle()释放内存 4 (四) 释放对象的引用 4 (五) 其他 5 三.内存监测工具 DDMS --> Heap 5 四.内存分析工具 MAT(Memory Analyzer Tool) 7 (一) 生成.hprof文件 7 (二) 使用MAT导入.hpro

Android下将图片载入到内存中

Android的系统的标准默认每一个应用程序分配的内存是16M.所以来说是很宝贵的,在创建应用的时候要尽可能的去节省内存,可是在载入一些大的文件的时候,比方图片是相当耗内存的,一个1.3M的图片,分辨率是2560X1920(宽X高)图片当载入到手机内存的时候就会请求19M的一块内存,这是远远超出了系统自带的内存空间,这时候应用程序就会挂掉,所以我们要进行图片的缩放处理,以下我就来带大家创建一个用来图片缩放的应用: 应用效果图例如以下: 核心代码的实现: package com.examp.loa