如何使用Java在Android编程中实现多线程处理,将指定文件夹内的所有.jpg图片文件批量压缩(使用bitmap.compress方法),并将每一个压缩后的图片文件保存到另一个指定位置?请提供相应的代码示例,并确保包含详细的注释解释每个步骤和关键部分。
时间: 2024-11-15 18:29:31 浏览: 10
在Android编程中,我们可以使用Java的`Thread`类或更推荐的`ExecutorService`来创建并管理多线程。下面是一个简单的例子,展示了如何使用`ExecutorService`来批量压缩图片并保存到指定目录:
```java
import android.os.AsyncTask;
import android.util.Log;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
// 创建一个自定义的AsyncTask子类,用于压缩和保存图片
public class ImageCompressTask extends AsyncTask<File, Integer, Void> {
private static final String TAG = "ImageCompressTask";
private List<File> sourceFiles; // 原始图片列表
private String destinationDir; // 目标目录
public ImageCompressTask(List<File> files, String dest) {
this.sourceFiles = files;
this.destinationDir = dest;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
Log.d(TAG, "开始压缩图片任务");
// 显示进度条或者其他UI更新
// 这里省略了显示进度的部分,实际应用中可以加入
}
@Override
protected Void doInBackground(File... params) {
for (File file : sourceFiles) {
if (file.getName().endsWith(".jpg")) { // 只处理.jpg文件
try {
File compressedFile = new File(destinationDir + "/" + file.getName()); // 新建压缩后的文件路径
Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
bitmap.compress(Bitmap.CompressFormat.JPEG, 80, new FileOutputStream(compressedFile)); // 压缩并保存
publishProgress((int) (100 * (sourceFiles.indexOf(file) + 1) / sourceFiles.size())); // 发送进度信息
deleteOriginalAfterCompression(file); // 删除原图(如果有需要)
} catch (IOException e) {
Log.e(TAG, "压缩图片失败", e);
}
}
}
return null;
}
private void deleteOriginalAfterCompression(File original) {
original.delete(); // 删除原图
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
Log.d(TAG, "图片压缩任务完成");
// 进度条或其他UI更新完成
}
// 重写onProgressUpdate方法,传递进度百分比给UI
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
// 在这里更新UI,显示进度
}
}
// 使用示例
List<File> imageFiles = getJpgFilesFromFolder("/path/to/source/folder"); // 获取源文件夹中的.jpg文件列表
String destination = "/path/to/destination/folder"; // 设置目标文件夹
new ImageCompressTask(imageFiles, destination).execute(); // 启动任务
```
在这个例子中,我们创建了一个名为`ImageCompressTask`的异步任务,它遍历源文件夹中的.jpg文件,逐个压缩然后保存到目标文件夹。`doInBackground`方法在后台线程中运行,而`publishProgress`用于更新UI的进度。注意在实际应用中,可能还需要处理可能出现的异常。
阅读全文