이미지 편집기에서 대용량 PNG를 저장하는 속도가 느리기 때문에 작업이 일시 중지 (닫힘) 된 후에 AsyncTask를 사용하여 백그라운드로 저장합니다. 그것은 일반적으로 완벽하게 작동합니다. 하지만 때때로 (몇 시간 동안 백그라운드에서 앱을 유지 한 다음 앱을 포 그라운드로 가져간 다음) 저장이 지연됩니다. 작업을 마친 후 20 초가 지난 것입니다.비동기 PNG 저장이 때로는 느림
당신은 투명성에 대해 걱정하지 않는다@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);
}
}
왜 asynctask 대신 서비스를 사용하지 않습니까? –
@AjayShrestha 감사합니다. 자습서를 알고 있습니까? – AVEbrahimi
'진짜로 큰 PNG 저장은 느립니다. 큰 비트 맵으로 어지럼 쳐지는 것은 느립니다. 비트 맵을 저장하고 있습니다. 'saveBitmapAsPngAsync()'. – greenapps