"执行doInBackground()"时发生错误LRX210更新后(Nexus 5)

时间:2014-11-13 09:57:12

标签: java android runtime-error android-5.0-lollipop

我只是想知道其他人是否有这个问题。 我有两个Nexus 5,一个运行5.0 LPX13D(开发预览),另一个运行5.0 LRX210(官方发布)。 在我的应用程序中,我从AsyncTasks doInBackground()方法调用方法调用getFiles()。 在运行LPX13D的手机上,这很好用,应用程序运行完美。 但是在运行LRX210的手机上,应用程序在"File[] fileList = directory.listFiles();"行崩溃,错误为java.lang.RuntimeException: An error occured while executing doInBackground()

它只发生在运行LRX210的手机上。从我所看到的,该方法不是访问UI线程,所以它应该工作正常。 如果其他人遇到问题,并且找到了解决办法,我们将非常感谢任何帮助。

AsyncTask的完整代码如下。

提前致谢 科里:)

    public class UpdateDataSet extends AsyncTask<List, String, List> {

        @Override
        protected List doInBackground(List... params) {
            getFiles(Environment.getExternalStorageDirectory() + File.separator + Constants.DIRECTORY);
            return null;

        }

        @Override
        protected void onPostExecute(List recordingList) {
            super.onPostExecute(recordingList);
            rAdapter.notifyDataSetChanged();

        }

        public void getFiles(String directoryName){
            File directory = new File(directoryName);
            Log.v("FilesListFragment", "getFiles();");
            File[] fileList = directory.listFiles();

            for(File file: fileList){
                if(file.isFile() && !files.contains(file)){
                    files.add(file);
                }
                /*
                else if(file.isDirectory()){
                    files(file.getAbsoluteFile(), false);
                }
                */
            }
            updateRecordingsList();
        }

        public void updateRecordingsList(){

            for(int i = 0; i < files.size(); i++) {
                boolean fileFound = false;
                for (int j = 0; j < recordingsList.size(); j++) {
                    if (recordingsList.get(j).getFile().equals(files.get(i))) {
                        fileFound = true;
                    }
                }
                if(fileFound != true){
                    recordingsList.add(new Recording(files.get(i), new Date(files.get(i).lastModified())));
                }
            }
            if(rAdapter != null) {
                Log.i("FileListFragment", "notifyDataSetChanged()");
            }
            //Collections.sort(recordingsList);


        }
    }

}

编辑:

以下是过滤到我的特定包名称的完整logat:

11-13 20:00:19.753    3539-3559/com.bacon.corey.audiotimeshift D/OpenGLRenderer﹕ Render dirty regions requested: true
11-13 20:00:19.762    3539-3539/com.bacon.corey.audiotimeshift D/Atlas﹕ Validating map...
11-13 20:00:19.846    3539-3560/com.bacon.corey.audiotimeshift V/FilesListFragment﹕ getFiles();
11-13 20:00:19.851    3539-3560/com.bacon.corey.audiotimeshift E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #1
    Process: com.bacon.corey.audiotimeshift, PID: 3539
    java.lang.RuntimeException: An error occured while executing doInBackground()
            at android.os.AsyncTask$3.done(AsyncTask.java:300)
            at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
            at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
            at java.util.concurrent.FutureTask.run(FutureTask.java:242)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:818)
     Caused by: java.lang.NullPointerException: Attempt to get length of null array
            at com.bacon.corey.audiotimeshift.FilesListFragment$UpdateDataSet.getFiles(FilesListFragment.java:124)
            at com.bacon.corey.audiotimeshift.FilesListFragment$UpdateDataSet.doInBackground(FilesListFragment.java:107)
            at com.bacon.corey.audiotimeshift.FilesListFragment$UpdateDataSet.doInBackground(FilesListFragment.java:103)
            at android.os.AsyncTask$2.call(AsyncTask.java:288)
            at java.util.concurrent.FutureTask.run(FutureTask.java:237)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:818)

1 个答案:

答案 0 :(得分:0)

以下行中的fileList似乎评估为null

File[] fileList = directory.listFiles();

如果我们在Javadoc中查看(参见:here),我们可以看到:

  

如果此抽象路径名不表示目录,则此方法返回null。

因此,我要做的第一件事就是调试应用程序并查找以下行:

Environment.getExternalStorageDirectory() + File.separator + Constants.DIRECTORY;

File directory = new File(directoryName);
File[] fileList = directory.listFiles();

如果路径名称正确,可能还有其他原因导致未创建对文件的引用,例如:

  • Environment.getExternalStorageDirectory()返回主要内容 外部存储目录。此目录目前可能不是 如果已由用户安装,则可访问,已被删除 设备或其他一些问题已经发生。你可以确定它 当前状态为getExternalStorageState()
  • 在具有多个用户的设备上(如UserManager所述) 用户拥有自己独立的外部存储空间。应用程序只有 为他们正在运行的用户访问外部存储。在 具有多个&#34;外部&#34;的设备存储目录,这个目录 代表&#34;主要&#34;用户将与之交互的外部存储 用。可通过以下方式访问辅助存储。
  • 最后,写入此路径需要WRITE_EXTERNAL_STORAGE 权限,并从读取访问开始需要 READ_EXTERNAL_STORAGE权限,如果是,则自动授予 你持有写权限。

有关详细信息,请参阅:http://developer.android.com/reference/android/os/Environment.html