Android开发最具前景,Android开发常见的一些错误异常和解决方法

Android是基于JAVA语言演变的,Android开发现在已经被公认为最具有前景的职业,因为人工智能目前还不是高峰阶段,虚拟现实技术高峰期就在20年后,目前Android开发中常见的一些异常和错误,在这里整理了一下。


一、显示Failed to install *.apk on device 'emulator-5554': timeout超时解决方法

错误方法:​运行程序安装时,提示模拟器超时
解决办法:Mac环境下,可以使用通过重启 adb 重新建立连接,基本上几秒就可以搞定。
windows环境下重启adb无效,也可能是我等得不够久。直接关闭模拟器,重新 launch。

二、打开Eclipse开发的时候,提示 “Failed to create the Javae Virtual Machine”错误
错误方法:无法创建Java虚拟机
出错情况:系统还原后出现或者感觉莫名其妙出现。实际上应该是环境、配置等发生变化,如果出现这个问题,请回顾之前有做过什么事情,比如安装或者更新JDK,修改过环境变量等等。

解决方法:首先确定JDK已安装,环境变量已配置(JAVA_HOME, Path等),修改后重启系统,我就是这么搞定的。

// 1. 直接删掉虚拟机位置项, -vm 选项  
          
// 2. 添加java虚拟机具体位置,分成两行,例如  
-vm  
C:\Program Files\java\jdk1.6.0_29\bin\javaw.exe  
          
// 3. 减少堆空间的最大值,一般是砍一半  
-Xmx1024m   
-Xmx512m  
-Xmx256m  
          
// 4. 修改JDK版本号,对应你的版本  
-Dosgi.requiredJavaVersion=1.6  
如果无上述问题,那只能修改 eclipse.ini 文件,请自行选择一种或几种进行尝试。

1、特定业务需求下try cath 异常需要catch可能的RuntimeException,Android开发常见的一些异常和解决方法就在这里,否则可能出现catch不全导致的意外问题(如app崩溃)。

之所以将此问题放在第一位,是因为前阵子中项目中出现了此类情况,并且这种情况很容易不注意或遗忘,但其错误却是致命的。
在Java/Android开发中,当调用一个函数时,此函数抛出一个A类型的异常,很自然的,在调用的地方我们会try.. catch此异常,并且绝大多数情况下,捕获异常是由Eclispe自动提示并生成的,函数抛出A异常,则调用的地方catch A,实际上,我们最好必须在catch A后再加上一个catch(Exception ex){}。原因在于防范于某些不可确定发生的问题而导致可能抛出的其他异常类型(实际上是特定的RuntimeException异常/unchecked异常,编码时本不推荐catch RuntimeException,但在移动开发特定业务场景中加上对其捕获可以有效防止App意外崩溃)。
上次就遇到了在接收推送消息时,new JSONObject()时,很自然的只catch了JSONException,而没有进一步的catch Exception,而实际上由于服务端传过来的数据格式错误后导致其抛出了java.lang.NumberFormatException,一步步跟踪代码后发现在源代码中确实存在可能抛出此异常的情形,而没被catch到,直接将导致app崩溃。此后谨记!
2、因so文件目录引起的UnsatisfiedLinkError: … :findLibrary returned null问题。
Android开发中,不可避免的可能会引用到外部so文件,设置一个项目中可能需要引用多个不同的外部so文件。因为不同的引入库中so文件的目录可能不同,导致打包后生成的项目lib目录中的目录结构是不同的外部so文件目录的合集。可能会出现armabi/armeabi-v7a/x86/mips等,一般情况下,armabi应该是有的,当此三个目录下的文件可能不同时,在某些特定机型下很可能会出现如上错误。原因在于不同的机型CPU结构不同导致搜寻不同的目录下面的包,而由于外部库不同的so文件目录可能armabi下还有a、b so文件,而x86下可能只含有a,此时解决方案如下:
直接删除其他目录(如armabi-v7a/mips/x86等),只保持armabi目录即可,当不存在x86目录时,相应机型也自然会取armabi目录下搜寻相应so文件。
3、Can't create handler inside thread that has not called Looper.prepare。
这个问题其实也比较经典了,原因在于,Android中的非UI线程不能进行修改UI操作(当然,严格意义上来说SurfaceView和TextureView除外),一般常见于在子线程中执行了如 Toast.makeText 等操作。一般借助于子线程和主线程消息通信机制来解决。
常见解决方法如:
1).Handler - Message方式;
2).Handler - postDelay方式;
3).activity.runOnUiThread(runnable)方式等。

猜你喜欢

转载自blog.csdn.net/du_23tiyanwang/article/details/80847584