android 复制大量文件,显示进度

在 Android 平台上复制大量文件并显示进度可以通过以下步骤实现:

1. 使用 AsyncTask 或线程池执行复制任务

首先,你可以使用 AsyncTask 或者 ExecutorService(线程池)来执行文件复制操作。这可以确保文件复制在后台线程中进行,避免阻塞主线程。

java
public 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 方法中实现文件复制逻辑。使用 FileInputStreamFileOutputStream 来逐个复制文件,并在复制每个文件后更新进度。

java
private 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更新方式可以根据实际需求进行调整和优化。