android 复制大量文件,显示进度
在 Android 平台上复制大量文件并显示进度可以通过以下步骤实现:
1. 使用 AsyncTask 或线程池执行复制任务
首先,你可以使用 AsyncTask 或者 ExecutorService(线程池)来执行文件复制操作。这可以确保文件复制在后台线程中进行,避免阻塞主线程。
javapublic class FileCopyTask extends AsyncTask<Void, Integer, Void> {
private Context mContext;
private File mSourceDirectory;
private File mDestinationDirectory;
public FileCopyTask(Context context, File sourceDirectory, File destinationDirectory) {
mContext = context;
mSourceDirectory = sourceDirectory;
mDestinationDirectory = destinationDirectory;
}
@Override
protected Void doInBackground(Void... voids) {
// 执行文件复制操作
copyFiles(mSourceDirectory, mDestinationDirectory);
return null;
}
private void copyFiles(File source, File destination) {
// 实现文件复制逻辑
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
// 更新UI显示进度
int progress = values[0];
// 更新进度条或其他UI元素
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
// 复制完成,更新UI或执行其他操作
}
}
2. 实现文件复制逻辑
在 copyFiles
方法中实现文件复制逻辑。使用 FileInputStream
和 FileOutputStream
来逐个复制文件,并在复制每个文件后更新进度。
javaprivate void copyFiles(File source, File destination) {
File[] files = source.listFiles();
int totalCount = files.length;
int progress = 0;
for (File file : files) {
File newFile = new File(destination, file.getName());
try {
FileInputStream in = new FileInputStream(file);
FileOutputStream out = new FileOutputStream(newFile);
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
in.close();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
progress++;
// 更新进度
publishProgress((int) ((progress / (float) totalCount) * 100));
}
}
3. 更新UI显示进度
在 onProgressUpdate
方法中更新 UI,例如更新进度条或显示百分比。
4. 启动任务并处理权限
在 Activity 或 Fragment 中启动任务,并确保已经获取文件读写权限。
java// 检查和请求文件读写权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
REQUEST_WRITE_EXTERNAL_STORAGE);
} else {
// 已授予权限,执行文件复制任务
FileCopyTask copyTask = new FileCopyTask(this, sourceDir, destDir);
copyTask.execute();
}
注意事项:
- 确保在主线程之外执行文件操作,避免 ANR(Application Not Responding)错误。
- 处理好文件读写权限,特别是在 Android 6.0 及以上版本需要动态请求权限。
- 如果复制的文件较大或者数量较多,考虑在通知栏显示进度,以便用户可以在后台查看复制进度。
以上是一个基本的实现框架,具体的文件复制逻辑和UI更新方式可以根据实际需求进行调整和优化。