Асинхронное сохранение 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;

Другие вопросы по тегам