我有一个应用程序,可以将文件从一个目录复制到另一个目录。但是每次我调用复制文件的方法时,UI(窗口)都会冻结,直到完成复制为止。你知道为什么吗?始终冻结目录中的文件数量无关紧要。 这是我的代码:
public void startProcess(File orgDir, File destDir) {
Screen1Controller sf = new Screen1Controller();
int y = 1;
try {
File[] files = orgDir.listFiles();
for (File file : files) {
if (file.isDirectory() == false) {
File destinationPath = new File(destDir.getCanonicalPath() + "\\");
destDir = new File(destinationPath + "\\" + "");
destDir.mkdir();
System.out.println("file:" + file.getCanonicalPath());
try {
String fileNameWithOutExt = file.getName().replaceFirst("[.][^.]+$", "");
File destFile = new File(destDir.getPath() + "\\" + file.getName());
if (Files.exists(Paths.get(destFile.getPath()))) {
System.out.println("There is a duplicate.");
File[] destFiles = destDir.listFiles();
for (File destinationFile : destFiles) {
if (destinationFile.getName().startsWith(fileNameWithOutExt)) {
y++;
}
}
File newFile = new File(orgDir.getPath() + "\\" + fileNameWithOutExt + "." + y);
file.renameTo(newFile);
File destPath = new File(destDir.getPath() + "\\" + newFile.getName());
System.out.println(newFile.getCanonicalPath());
Files.copy(Paths.get(newFile.getCanonicalPath()), Paths.get(destPath.getPath()));
newFile.renameTo(new File(orgDir.getPath() + "\\" + fileNameWithOutExt));
} else {
Files.copy(Paths.get(file.getPath()), Paths.get(destFile.getPath()));
}
} catch (Exception e) {
e.printStackTrace();
}
} else {
startProcess(file, destDir);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
答案 0 :(得分:2)
您必须创建一个新线程来处理新线程而不是UI线程中的复制
maxConnLifetimeMillis
将您的方法放入其中,即复制文件的方法。
所以看起来像
new Thread(new Runnable() {
@Override
public void run() {
}
}).start();