Fix NPE in ThumbnailsTask.

The async task was being cancelled, but there was still a race condition
in how the thumbnails list was being managed. This attempts to fix that.
fork-5.53.8
Cody Henthorne 2021-06-04 12:25:27 -04:00 zatwierdzone przez Alex Hart
rodzic e4755b298f
commit 7da47c9586
1 zmienionych plików z 32 dodań i 21 usunięć

Wyświetl plik

@ -21,6 +21,7 @@ import java.io.IOException;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@RequiresApi(api = 23)
public class VideoThumbnailsView extends View {
@ -28,7 +29,7 @@ public class VideoThumbnailsView extends View {
private static final String TAG = Log.tag(VideoThumbnailsView.class);
private MediaInput input;
private ArrayList<Bitmap> thumbnails;
private volatile ArrayList<Bitmap> thumbnails;
private AsyncTask<Void, Bitmap, Void> thumbnailsTask;
private OnDurationListener durationListener;
@ -169,6 +170,7 @@ public class VideoThumbnailsView extends View {
final float thumbnailWidth;
final float thumbnailHeight;
final int thumbnailCount;
long duration;
ThumbnailsTask(final @NonNull VideoThumbnailsView view, final @NonNull MediaInput input, final float thumbnailWidth, final float thumbnailHeight, final int thumbnailCount) {
@ -191,8 +193,11 @@ public class VideoThumbnailsView extends View {
@Override
public boolean publishProgress(int index, Bitmap thumbnail) {
boolean notCanceled = !isCancelled();
if (notCanceled) {
ThumbnailsTask.this.publishProgress(thumbnail);
return !isCancelled();
}
return notCanceled;
}
@Override
@ -205,20 +210,26 @@ public class VideoThumbnailsView extends View {
@Override
protected void onProgressUpdate(Bitmap... values) {
final VideoThumbnailsView view = viewReference.get();
if (view != null) {
view.thumbnails.addAll(Arrays.asList(values));
if (isCancelled()) {
return;
}
VideoThumbnailsView view = viewReference.get();
List<Bitmap> thumbnails = view != null ? view.thumbnails : null;
if (thumbnails != null) {
thumbnails.addAll(Arrays.asList(values));
view.invalidate();
}
}
@Override
protected void onPostExecute(Void result) {
final VideoThumbnailsView view = viewReference.get();
VideoThumbnailsView view = viewReference.get();
List<Bitmap> thumbnails = view != null ? view.thumbnails : null;
if (view != null) {
view.setDuration(duration);
view.invalidate();
Log.i(TAG, "onPostExecute, we have " + view.thumbnails.size() + " thumbs");
Log.i(TAG, "onPostExecute, we have " + (thumbnails != null ? thumbnails.size() : "null") + " thumbs");
}
}
}