Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android for loop正在无缘无故地提前中断_Java_Android - Fatal编程技术网

Java Android for loop正在无缘无故地提前中断

Java Android for loop正在无缘无故地提前中断,java,android,Java,Android,我有一个公认的非常大的for循环,它总是提前结束。它首先通过递归方法找到用户音乐文件夹中的所有歌曲,然后将它们添加到数据库中,以便将来更快地检索。我已经在一个异步上设置了它,下面是它的相关部分 private void updateSongsDB() { ArrayList<File> fileList = getAllDirectories(mCurrentRootFile); int numDirectories = fileList.size(); in

我有一个公认的非常大的for循环,它总是提前结束。它首先通过递归方法找到用户音乐文件夹中的所有歌曲,然后将它们添加到数据库中,以便将来更快地检索。我已经在一个异步上设置了它,下面是它的相关部分

private void updateSongsDB() {
    ArrayList<File> fileList = getAllDirectories(mCurrentRootFile);
    int numDirectories = fileList.size();
    int numScanned = 0;
    resetDB();

    // Setup the strings
    String title;
    String artist;
    String album;
    String duration;
    String genre;
    String track_number;
    String total_tracks;

    try{
        for(File file : fileList) {
            try {
                MediaMetadataRetriever mMetaDataRetriever = new MediaMetadataRetriever();
                mMetaDataRetriever.setDataSource(file.getAbsolutePath());

                if (mMetaDataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_HAS_AUDIO) != null) {
                    // Extract the information
                    title = mMetaDataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE);
                    title = (title != null) ? title : "";

                    artist = mMetaDataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST);
                    artist = (artist != null) ? artist : "";

                    album = mMetaDataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUM);
                    album = (album != null) ? album : "";

                    duration = mMetaDataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
                    duration = (duration != null) ? duration : "";

                    genre = mMetaDataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_GENRE);
                    genre = (genre != null) ? genre : "";

                    track_number = mMetaDataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_CD_TRACK_NUMBER);
                    track_number = (track_number != null) ? track_number : "";

                    total_tracks = mMetaDataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_NUM_TRACKS);
                    total_tracks = (total_tracks != null) ? total_tracks : "";

                    insertDBRow(title, artist, album, duration, genre, track_number, total_tracks, file.getAbsolutePath());
                }
            }
            catch (IllegalArgumentException e) {
                // This is not a playable media file, ignore it
            }
            numScanned++;
            publishProgress((float) ((numScanned / (float) numDirectories) * 100));

            // Escape early if cancel() is called
            //if (isCancelled()) break;
        }
    }
    catch(Exception e) {
        // No files in the list
    }
    Log.d("Total Files", String.valueOf(numDirectories));
    Log.d("Number Scanned", String.valueOf(numScanned));
}

private void resetDB() {
    mSongListDB.execSQL(SongReaderContract.SQL_DELETE_ENTRIES);
    mSongListDB.execSQL(SongReaderContract.SQL_CREATE_ENTRIES);
}

private ArrayList<File> getAllDirectories(File rootFile) {
    File[] fileList = rootFile.listFiles();

    ArrayList<File> dirs = new ArrayList<>();

    try {
        for (File file : fileList) {
            if (file.isDirectory()) {
                dirs.addAll(getAllDirectories(file));
            } else {
                dirs.add(file);
            }
        }
    }
    catch(Exception e) {
        // No files in the list
    }

    return dirs;
}

private void insertDBRow(String title, String artist, String album, String duration,
                         String genre, String track_number, String total_tracks, String path) {

    ContentValues values = new ContentValues();

    values.put(SongReaderContract.FeedEntry.COLUMN_NAME_TITLE, title);
    values.put(SongReaderContract.FeedEntry.COLUMN_NAME_ARTIST, artist);
    values.put(SongReaderContract.FeedEntry.COLUMN_NAME_ALBUM, album);
    values.put(SongReaderContract.FeedEntry.COLUMN_NAME_DURATION, duration);
    values.put(SongReaderContract.FeedEntry.COLUMN_NAME_GENRE, genre);
    values.put(SongReaderContract.FeedEntry.COLUMN_NAME_TRACK_NUMBER, track_number);
    values.put(SongReaderContract.FeedEntry.COLUMN_NAME_TOTAL_TRACKS, total_tracks);
    values.put(SongReaderContract.FeedEntry.COLUMN_NAME_PATH, path);

    // Insert the new row
    mSongListDB.insert(SongReaderContract.FeedEntry.TABLE_NAME, null, values);
}
弹出日志是从my ASync的onPostExecute函数调用的。我检查了这是否是内存问题,但在运行时,内存从未超过13MB(20MB),CPU使用率也从未超过10%。我完全不知所措。我已尝试将for循环重新格式化为:

for (int curFile=0; curFile<numDirectories; curFile++)
但该代码也返回完全相同的978或979个条目。我还尝试将整个for循环传递到一个单独的ArrayList中,而不是直接插入,然后循环通过该列表进行插入,但是第一个for循环仍然只将978或979项放入该ArrayList中。我想我可以把它分成单独的for循环,每个循环只能处理500次迭代,但这看起来很混乱,实践也很糟糕,而且我甚至不知道它是否有效


任何帮助都将不胜感激。

事实证明,我在MediaMetaData对象中捕获了错误的异常,因此当它到达未正确初始化的文件时,它将运行时异常抛出到我的循环中,从而结束循环本身。

您有两个空的catch块。也许你应该在这些方面做些什么,比如至少打印堆栈跟踪。你的代码正在悄无声息地失败,你想知道为什么……嗯,我是个哑巴。谢谢大家,我花了好几个小时研究这个问题,直到你们提到它,我才注意到我捕获了错误的异常类型。当setDataSource在MediaMetaDataRetriever上失败时,它会引发运行时异常,而不是IllegaArgument异常。这就是重新使用真正旧项目中的代码所得到的。
for (int curFile=0; curFile<numDirectories; curFile++)