public class ImageCompressor {
private Context context;
private OnImageCompressedListener listener;
public ImageCompressor(Context context) {
this.context = context;
}
public void compressImage(File originalImageFile, OnImageCompressedListener listener) {
this.listener = listener;
new ImageCompressionTask().execute(originalImageFile);
}
private class ImageCompressionTask extends AsyncTask<File, Void, File> {
@Override
protected File doInBackground(File... files) {
File originalImageFile = files[0];
try {
return new Compressor(context)
.compressToFile(originalImageFile);
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
@Override
protected void onPostExecute(File compressedImageFile) {
if (compressedImageFile != null) {
listener.onImageCompressed(compressedImageFile);
} else {
listener.onImageCompressionFailed();
}
}
}
public interface OnImageCompressedListener {
void onImageCompressed(File compressedImageFile);
void onImageCompressionFailed();
}
}
在这个例子中,我们创建了一个名为
ImageCompressor
的工具类,它接受一个Context
参数,用于创建Compressor
实例,和一个OnImageCompressedListener
参数,用于处理压缩结果。
compressImage()
方法接受一个File
参数,它将包含我们要压缩的图片文件,以及一个OnImageCompressedListener
参数,它将处理压缩结果。在compressImage()
方法中,我们创建了一个ImageCompressionTask
的实例,并执行异步压缩操作。
ImageCompressionTask
类继承自AsyncTask
类,它接受一个File
参数,它将包含我们要压缩的图片文件。在doInBackground()
方法中,我们使用Compressor
类来压缩图片文件,并返回压缩后的文件。在onPostExecute()
方法中,我们处理压缩成功或失败的情况,并使用压缩后的文件调用OnImageCompressedListener
接口中的方法。
OnImageCompressedListener
接口定义了两个方法:onImageCompressed()
和onImageCompressionFailed()
。onImageCompressed()
方法将在压缩成功时调用,它接受一个File
参数,它将包含压缩后的图片文件。onImageCompressionFailed()
方法将在压缩失败时调用,它不接受任何参数。
你可以使用以下代码来调用ImageCompressor
类:
File originalImageFile = new File("path/to/your/image");
ImageCompressor compressor = new ImageCompressor(context);
compressor.compressImage(originalImageFile, new ImageCompressor.OnImageCompressedListener() {
@Override
public void onImageCompressed(File compressedImageFile) {
// 压缩成功,使用compressedImageFile作为压缩后的文件
}
@Override
public void onImageCompressionFailed() {
// 压缩失败
}
});
在这个例子中,我们使用
compressImage()
方法来执行异步压缩操作,并使用OnImageCompressedListener
接口来处理压缩结果。ImageCompressor
类将在后台线程中执行压缩操作,并在主线程中处理结果。注意,这个例子中的代码是使用
AsyncTask
类来实现异步操作的。如果你想使用其他异步处理方式,例如使用 RxJava 库来执行异步操作,请参考另一篇文章Compressor结合RxJava库实现异步图片压缩_xuwu007的博客-CSDN博客