我只是想知道其他人是否有这个问题。
我有两个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)
答案 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