Асинхронное сохранение PNG иногда происходит так медленно
В графическом редакторе сохранение действительно больших PNG происходит медленно, поэтому я использовал AsyncTask для сохранения в фоновом режиме после приостановки активности (закрытия). Обычно это работает отлично. Но иногда (возможно, после того, как приложение часами остается в фоновом режиме, а затем выводится приложение на передний план) сохранение задерживается, может быть, через 20 секунд после закрытия действия.
@Override
protected void onPause() {
savePngAsync();
}
public void savePngAsync() {
int theBitmapW=Math.max(png_width,MAX_DRAWN_X);
int theBitmapH=Math.max(png_height,MAX_DRAWN_Y);
Bitmap.Config conf = Bitmap.Config.ARGB_8888; // see other conf types
Bitmap bmp = Bitmap.createBitmap(theBitmapW, theBitmapH, conf); // this creates a MUTABLE bitmap
Canvas canvas = new Canvas(bmp);
drawOnCanvas(canvas,true,false);
String outputfilename=filename+".png";
AsyncPngSaver asyncPngSaver=new AsyncPngSaver(outputfilename);
asyncPngSaver.execute(bmp);
}
public class AsyncPngSaver extends AsyncTask<Bitmap,Integer,Boolean>
{
public String outputfilename;
public AsyncPngSaver(String outputfilename)
{
this.outputfilename=outputfilename;
}
@Override
protected Boolean doInBackground(Bitmap... bitmaps) {
try {
FileOutputStream out=null;
Bitmap bmp = bitmaps[0];
try {
out = new FileOutputStream(outputfilename);
bmp.compress(Bitmap.CompressFormat.PNG, 100, out); // bmp is your Bitmap instance
// PNG is a lossless format, the compression factor (100) is ignored
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (out != null) {
out.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
@Override
protected void onPostExecute(Boolean aBoolean) {
super.onPostExecute(aBoolean);
Log.d(Utils.DTAG,"png saved in background, broadcasting");
Intent in = new Intent(Utils.KEY_REFRESH_BROADCAST);
getContext().sendBroadcast(in);
}
}
1 ответ
Вы не заботитесь о прозрачности, тогда, пожалуйста, используйте Bitmap.Config.RGB_565
это будет быстро!!!
Bitmap.Config conf = Bitmap.Config.RGB_565;