Android 递归栈溢出问题解决

来源:互联网 发布:淘宝官方网站登录网站 编辑:程序博客网 时间:2024/06/06 04:05

首先区别下栈溢出和堆溢出:

  • 我们知道在方法栈中存放着对象调用的引用,栈是有一定深度(长度)的,如果递归调用超过了栈的深度就会触发栈溢出。

  • 而堆内存存放着new出来的对象,如果堆内存区域满了则会引发内存溢出

举个场景,我们在遍历sdcard文件的时候会用到递归,这里如果文件路径深的话就很有可能出现栈溢出,对于此问题的解决方法也很简单,就是不用递归,改为循环。

首先看看我们正常的递归操作:

public static void RecursiveTraversal(String path){    File file = new File(path);    file[] files = file.listFile();    if(files == null){        return;    }    int length = files.length();    for(int i=0; i < length; i++){        if(files[i].isDirectory()){            //递归调用            RecursiveTraversal(files[i].getAbsolutePath());        } else {            //do other...        }    }}

那我们不用递归,改用循环来处理如下:

public static void RecursiveTraversal(String path){    List<File> fileList = new ArrayList<File>();    fileList.add(new File(path));    while(!fileList.isEmpty()){        File file = fileList.remove(0);        file[] files = file.listFile();        if(files == null){            return;        }        int length = files.length();        for(int i=0; i < length; i++){            if(files[i].isDirectory()){            //将需要再次遍历的文件添加至list中            fileList.add(files[i]);            } else {            //do other...            }        }    }}

先将需要遍历的文件加入list中,然后遍历此list,如果文件为目录则继续添加至list,移除非目录文件,这样不停循环此list,知道没有元素为止,成功的避免了栈溢出问题。

1 0
原创粉丝点击