我使用了压缩图像库:https://github.com/zetbaitsu/Compressor。 该库必须运行UI线程,但compress函数位于非UI线程内部。因此,我将此功能移到了asynctask中。
这是正确的方法吗,您还有其他想法吗?正确使用asynctask execute()
还是应该使用executeOnExecutor()
还是不使用get()
函数?
public static class compressFile extends AsyncTask<Void, File, File> {
@Override
protected File doInBackground(Void... params) {
File thumbFile = null;
try {
thumbFile = new Compressor(MyApplication.getContext())
.setMaxWidth(width)
.setMaxHeight(height)
.setQuality(quality)
.setCompressFormat(Bitmap.CompressFormat.JPEG)
.compressToFile(new File(path), " " + System.currentTimeMillis());
} catch (Exception e) {
Mylog.printStackTrace(TAG + " error", e);
}
return thumbFile;
}
}
压缩非UI线程中的图像使用情况:
File compressedBigFile = new compressFile().execute().get();
答案 0 :(得分:1)
不,那是不对的。切勿在UI线程上使用AsyncTask.get。这样做会强制UI线程等待结果。这与根本不使用线程等效(实际上稍微更糟)。正确的做法是将任何需要结果的代码放入AsyncTask的onPostExecute中,以便在任务完成时运行它,并在必要时在处理过程中放置一个加载UI。