From 4332b54a7f75f2d027708498c29dc70cbdad5e9c Mon Sep 17 00:00:00 2001 From: alexcohn Date: Wed, 7 Aug 2019 23:13:56 +0300 Subject: [PATCH] fixing ANR on large files see https://stackoverflow.com/q/57067507/192373 1) use StringBuilder to accumulate the output text 2) convert it to String inside doInBackground, not on Main thread --- .../bravobit/ffmpeg/FFcommandExecuteAsyncTask.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/android-ffmpeg/src/main/java/nl/bravobit/ffmpeg/FFcommandExecuteAsyncTask.java b/android-ffmpeg/src/main/java/nl/bravobit/ffmpeg/FFcommandExecuteAsyncTask.java index 7ec21b4..9302c85 100644 --- a/android-ffmpeg/src/main/java/nl/bravobit/ffmpeg/FFcommandExecuteAsyncTask.java +++ b/android-ffmpeg/src/main/java/nl/bravobit/ffmpeg/FFcommandExecuteAsyncTask.java @@ -18,6 +18,7 @@ class FFcommandExecuteAsyncTask extends AsyncTask i private final long timeout; private long startTime; private Process process; + private StringBuilder outputStringBuilder = new StringBuilder(); private String output = ""; private boolean quitPending; @@ -39,6 +40,7 @@ protected void onPreExecute() { @Override protected CommandResult doInBackground(Void... params) { + CommandResult ret = CommandResult.getDummyFailureResponse(); try { process = shellCommand.run(cmd, environment); if (process == null) { @@ -46,16 +48,19 @@ protected CommandResult doInBackground(Void... params) { } Log.d("Running publishing updates method"); checkAndUpdateProcess(); - return CommandResult.getOutputFromProcess(process); + ret = CommandResult.getOutputFromProcess(process); + outputStringBuilder.append(ret.output); } catch (TimeoutException e) { Log.e("FFmpeg binary timed out", e); - return new CommandResult(false, e.getMessage()); + ret = new CommandResult(false, e.getMessage()); + outputStringBuilder.append(ret.output); } catch (Exception e) { Log.e("Error running FFmpeg binary", e); } finally { Util.destroyProcess(process); } - return CommandResult.getDummyFailureResponse(); + output = outputStringBuilder.toString(); + return ret; } @Override @@ -68,7 +73,6 @@ protected void onProgressUpdate(String... values) { @Override protected void onPostExecute(CommandResult commandResult) { if (ffmpegExecuteResponseHandler != null) { - output += commandResult.output; if (commandResult.success) { ffmpegExecuteResponseHandler.onSuccess(output); } else { @@ -107,7 +111,7 @@ private void checkAndUpdateProcess() throws TimeoutException, InterruptedExcepti return; } - output += line + "\n"; + outputStringBuilder.append(line); outputStringBuilder.append("\n"); publishProgress(line); } } catch (IOException e) {