Java doInBackground()期间异步任务崩溃
我正在为android制作一个文件管理器应用程序,并尝试使用AsyncTask实现复制粘贴功能来复制文件。当我尝试粘贴项目时,应用程序崩溃并报告:Java doInBackground()期间异步任务崩溃,java,android,Java,Android,我正在为android制作一个文件管理器应用程序,并尝试使用AsyncTask实现复制粘贴功能来复制文件。当我尝试粘贴项目时,应用程序崩溃并报告: 01-22 16:27:48.065: E/AndroidRuntime(8494): FATAL EXCEPTION: AsyncTask #1 01-22 16:27:48.065: E/AndroidRuntime(8494): Process: com.example.myapp, PID: 8494 01-22 16:27:48.065:
01-22 16:27:48.065: E/AndroidRuntime(8494): FATAL EXCEPTION: AsyncTask #1
01-22 16:27:48.065: E/AndroidRuntime(8494): Process: com.example.myapp, PID: 8494
01-22 16:27:48.065: E/AndroidRuntime(8494): java.lang.RuntimeException: An error occured while executing doInBackground()
01-22 16:27:48.065: E/AndroidRuntime(8494): at android.os.AsyncTask$3.done(AsyncTask.java:300)
01-22 16:27:48.065: E/AndroidRuntime(8494): at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
01-22 16:27:48.065: E/AndroidRuntime(8494): at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
01-22 16:27:48.065: E/AndroidRuntime(8494): at java.util.concurrent.FutureTask.run(FutureTask.java:242)
01-22 16:27:48.065: E/AndroidRuntime(8494): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
01-22 16:27:48.065: E/AndroidRuntime(8494): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
01-22 16:27:48.065: E/AndroidRuntime(8494): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
01-22 16:27:48.065: E/AndroidRuntime(8494): at java.lang.Thread.run(Thread.java:841)
01-22 16:27:48.065: E/AndroidRuntime(8494): Caused by: java.lang.IndexOutOfBoundsException: Invalid index 1, size is 0
01-22 16:27:48.065: E/AndroidRuntime(8494): at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
01-22 16:27:48.065: E/AndroidRuntime(8494): at java.util.ArrayList.get(ArrayList.java:308)
01-22 16:27:48.065: E/AndroidRuntime(8494): at com.example.myapp.MoveFiles.doInBackground(MoveFiles.java:30)
01-22 16:27:48.065: E/AndroidRuntime(8494): at com.example.myapp.MoveFiles.doInBackground(MoveFiles.java:1)
01-22 16:27:48.065: E/AndroidRuntime(8494): at android.os.AsyncTask$2.call(AsyncTask.java:288)
01-22 16:27:48.065: E/AndroidRuntime(8494): at java.util.concurrent.FutureTask.run(FutureTask.java:237)
01-22 16:27:48.065: E/AndroidRuntime(8494): ... 4 more
以下是我的AsyncTask类:
public class MoveFiles extends AsyncTask<ArrayList<File>, Integer, Boolean> {
private ProgressDialog pd;
private String path;
public MoveFiles(ProgressDialog pd, String path) {
this.pd = pd;
this.path = path;
}
@Override
protected Boolean doInBackground(ArrayList<File>... params) {
ArrayList<File> files = params[0];
int count = files.size();
try {
for (int i = 0; i < count; i++) {
File destination = new File (path + "/" + files.get(i).getName());
copyDirectory(files.get(i), destination);
}
}
catch (IOException e) {
e.printStackTrace();
return false;
}
return true;
}
protected void onPreExecute() {
pd.setMessage("Please wait..");
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pd.setMax(100);
pd.setIndeterminate(false);
pd.setCancelable(true);
pd.show();
}
protected void onPostExecute(Boolean result) {
pd.dismiss();
}
protected void onProgressUpdate(Integer...progress){
}
static void copyDirectory(File sourceLocation, File targetLocation) throws IOException {
if (sourceLocation.isDirectory() && sourceLocation.exists()) {
if (!targetLocation.exists()) {
targetLocation.mkdir();
}
String[] children = sourceLocation.list();
for (int i = 0; i < children.length; i++) {
copyDirectory(new File(sourceLocation, children[i]), new File(targetLocation, children[i]));
}
} else {
InputStream in = new FileInputStream(sourceLocation);
OutputStream out = new FileOutputStream(targetLocation);
// Copy the bits from instream to outstream
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
in.close();
in = null;
out.flush();
out.close();
out = null;
}
if (DisplayDirectoryActivity.getCut()) {
DeleteRecursive(sourceLocation);
}
}
static void DeleteRecursive(File fileOrDirectory) {
if (fileOrDirectory.isDirectory())
for (File child : fileOrDirectory.listFiles())
DeleteRecursive(child);
fileOrDirectory.delete();
}
}
以及“粘贴”按钮的代码:
case R.id.context_accept_paste:
MoveFiles copy = new MoveFiles(new ProgressDialog(this), path);
copy.execute(filesMoving);
for (int i = 0; i < filesMoving.size(); i++)
currentFileList.add(path + "/" + filesMoving.get(i).getName());
selectedPaths.clear();
mAdapter.notifyDataSetChanged();
mode.finish(); // Action picked, so close the CAB
return true;
我知道这是边界外的例外,但我不明白为什么它一直发生。非常感谢您的帮助在日志中打印计数并检查。第30行MoveFiles.java在哪里?看起来您在复制调用结束时删除了该文件。我不确定文件引用是如何工作的,但在遍历数组时您可能正在删除?01-22 17:36:24.080:D/count11397:4日志计数返回4 01-22 17:36:24.095:E/AndroidRuntime11397:原因:java.lang.IndexOutOfBoundsException:索引0无效,大小为0,尽管看起来不是这样。01-22 17:36:24.095:E/AndroidRuntime11397:at com.example.myapp.MoveFiles.doInBackgroundMoveFiles.java:32 MoveFiles.java第32行:`copyDirectoryfiles.geti,destination;`发生了什么事请写哪一行是30?