如何在安卓上优雅的搜索文件,解决The content of the adapter has changed but ListView did not receive a notification报错

时间:2021-7-9 作者:qvyue

码字辛苦!转载请注明出处!

我们知道,在安卓上运行JAVA有严格的内存限制,不能像PC上那样肆无忌惮的使用递归和多线程,否则~

如何在安卓上优雅的搜索文件,解决The content of the adapter has changed but ListView did not receive a notification报错
如何在安卓上优雅的搜索文件,解决The content of the adapter has changed but ListView did not receive a notification报错

OOM,经典不~

那么,如何在安卓上优雅搜索文件呢?

关键点就在于:

1、取代递归

2、适时终止上一个搜索线程

3、在主线程中更新List和View

4、避免线程中Activity对象造成的内存泄漏

——那我们把需要搜索的文件目录记录下来循环遍历,在回调时检测Activity生命周期,并进行线程切换,问题不就解决了嘛~

话不多说,上代码:

   //搜索文件线程
   private Thread t_searchFile;

   public interface SearchFileListener {
       void gotOne(File file);

       void onFinished(List searchedFiles);
   }

   //搜索文件
   public List searchFile(final Activity activity, final String filePath,
                                final String fileName, final SearchFileListener searchFileListener) {

       //终止上一个搜索线程(如果有)
       stopSearching();

       final List searchedFiles = new ArrayList();
       if (TextUtils.isEmpty(fileName) || TextUtils.isEmpty(filePath)) {
           return searchedFiles;
       }
       t_searchFile = new Thread() {
           @Override
           public void run() {
               super.run();

               //不使用递归,而是将需要扫描的文件目录记录下来
               List waitForSearchFilePath = new ArrayList();
               waitForSearchFilePath.add(new File(filePath));

               while (waitForSearchFilePath.size() > 0 && !isInterrupted() &&
                       //所有循环均检测Activity生命周期,以防内存泄漏
                       !activityIsDestroyed(activity)) {
                   File[] files = waitForSearchFilePath.get(0).listFiles();
                   if (files != null) {
                       for (int i = 0; i 

使用上述方法,实测该线程的内存(不含已检出的文件List)只有不到3K,OOM问题完美解决~

声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:qvyue@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。