Android常见出错:OutOfMemoryError与ArrayIndexOutOfBoundsException
2015-09-26 17:25 指针空间 阅读(719) 评论(0) 编辑 收藏 举报1、java.lang.OutOfMemoryError出错
很多的时候,我们使用Bitmap不会出现多大的问题。但是当机器资源不够的情况下,很多应用都会报出 OutOfMemoryError,当然报出这样的异常往往是给Bitmap分配内存时内存不足引起的。即便是很小的一个图片,也会有出错,如何解决呢?
解决办法如下:
[java] view plaincopy
1.public static Bitmap createBitmap(int width, int height, Bitmap.Config config) {
2. Bitmap bitmap = null;
3. try {
4. bitmap = Bitmap.createBitmap(width, height, config);
5. } catch (OutOfMemoryError e) {
6. while(bitmap == null) {
7. System.gc();
8. System.runFinalization();
9. bitmap = createBitmap(width, height, config);
10. }
11. }
12.}
经过最近不断的实验证明,当内存泄漏很大的时候,上述方法根本无法避免内存溢出。其实避免内存溢出还是要靠平时写代码的时候自己去注意。很多时候的溢出主要是因为Bitmap和Drawable资源没被释放造成的,尤其是当项目中图片资源很多的时候,这个问题尤为突出。
解决办法:当CreateBitmap之后,当这个Bitmap用完之后,那需要recycle这个资源。
还有当需要更换图片的背景资源的时候需要使用到Drawable,当需要更换那个Drawable时,原来的Drawable需要setCallback(null)来使Activity对原来的资源解除引用,从而使资源得到释放。Java的内存管理不像C++一般,但是也有它的灵活之处,只要仔细想想,还是可以将内存管理好的
2、但是我遇到的问题是这样的,先create再destroy,重复做10次以内程序就会出现挂掉的情况,出错信息各不相同,其中有java.lang.OutOfMemoryError报错,怀疑是ondestroy资源没有释放。
在super.onDestroy();System.exit(0);后,再运行就没有报错了。
查了相关资料,System.exit(0):退出整个应用程序,是针对整个Application的,将整个进程直接Kill掉。
finish函数会调用ondestroy,它仅仅把当前Activity退出了,但是并没有释放他的资源。
安卓系统自己决定何时从内存中释放应用程序。当系统没有可用内存到时候,会按照优先级,释放部分应用
finish是Activity的类,仅仅针对Activity,当调用finish()时,只是将活动推向后台,并没有立即释放内存,活动的资源并没有被清理;当调用System.exit(0)时,杀死了整个进程,这时候活动所占的资源也会被释放。
在开发android应用时,常常通过按返回键(即keyCode == KeyEvent.KEYCODE_BACK)就能关闭程序,其实大多情况下该应用还在任务里运行着,其实这不是我们想要的结果。
我们可以这样做,当用户点击自定义的退出按钮或返回键时(需要捕获动作),我们在onDestroy()里强制退出应用,或直接杀死进程,具体操作代码如下:
protected void onDestroy() {
super.onDestroy();
System.exit(0);
//或者下面这种方式
//android.os.Process.killProcess(android.os.Process.myPid());
}
3、java.lang.ArrayIndexOutOfBoundsException异常分析及解决 .
是一个非常常见的异常,从名字上看是数组下标越界错误,解决方法就是查看为什么下标越界。
下面是一个错误示例:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2
at test4.State.nextStates(State.java:93)
at test4.State.main(State.java:478)
从这些提示信息中可以获取如下信息:
1、错误发生在93行
2、发生错误的时候,下标的值为2
接下来分析为什么下标值为什么是2就可以解决了。