代码改变世界

Android常见出错:OutOfMemoryError与ArrayIndexOutOfBoundsException

2015-09-26 17:25  指针空间  阅读(709)  评论(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就可以解决了。