Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.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 doInBackground()期间异步任务崩溃_Java_Android - Fatal编程技术网

Java doInBackground()期间异步任务崩溃

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:

我正在为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: 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?