async image operations on Android

This commit is contained in:
Thibault Deckers 2020-03-23 16:39:59 +09:00
parent 0c30bfd19e
commit aee8756c5c
3 changed files with 17 additions and 16 deletions

View file

@ -35,29 +35,29 @@ public class ImageFileHandler implements MethodChannel.MethodCallHandler {
public void onMethodCall(@NonNull MethodCall call, @NonNull MethodChannel.Result result) {
switch (call.method) {
case "getImageEntries":
mediaStoreStreamHandler.fetchAll(activity);
new Thread(() -> mediaStoreStreamHandler.fetchAll(activity)).start();
result.success(null);
break;
case "getImageEntry":
getImageEntry(call, result);
new Thread(() -> getImageEntry(call, new MethodResultWrapper(result))).start();
break;
case "readAsBytes":
readAsBytes(call, result);
new Thread(() -> readAsBytes(call, new MethodResultWrapper(result))).start();
break;
case "getImageBytes":
getImageBytes(call, result);
new Thread(() -> getImageBytes(call, new MethodResultWrapper(result))).start();
break;
case "cancelGetImageBytes":
cancelGetImageBytes(call, result);
new Thread(() -> cancelGetImageBytes(call, new MethodResultWrapper(result))).start();
break;
case "delete":
delete(call, result);
new Thread(() -> delete(call, new MethodResultWrapper(result))).start();
break;
case "rename":
rename(call, result);
new Thread(() -> rename(call, new MethodResultWrapper(result))).start();
break;
case "rotate":
rotate(call, result);
new Thread(() -> rotate(call, new MethodResultWrapper(result))).start();
break;
default:
result.notImplemented();

View file

@ -1,6 +1,8 @@
package deckers.thibault.aves.channelhandlers;
import android.app.Activity;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import deckers.thibault.aves.model.provider.MediaStoreImageProvider;
@ -27,8 +29,9 @@ public class MediaStoreStreamHandler implements EventChannel.StreamHandler {
void fetchAll(Activity activity) {
Log.d(LOG_TAG, "fetchAll start");
// Instant start = Instant.now();
new MediaStoreImageProvider().fetchAll(activity, eventSink); // 350ms
eventSink.endOfStream();
Handler handler = new Handler(Looper.getMainLooper());
new MediaStoreImageProvider().fetchAll(activity, (entry) -> handler.post(() -> eventSink.success(entry))); // 350ms
handler.post(() -> eventSink.endOfStream());
// Log.d(LOG_TAG, "fetchAll complete in " + Duration.between(start, Instant.now()).toMillis() + "ms");
}
}

View file

@ -22,7 +22,6 @@ import deckers.thibault.aves.utils.MimeTypes;
import deckers.thibault.aves.utils.PermissionManager;
import deckers.thibault.aves.utils.StorageUtils;
import deckers.thibault.aves.utils.Utils;
import io.flutter.plugin.common.EventChannel;
public class MediaStoreImageProvider extends ImageProvider {
private static final String LOG_TAG = Utils.createLogTag(MediaStoreImageProvider.class);
@ -57,10 +56,9 @@ public class MediaStoreImageProvider extends ImageProvider {
MediaStore.Video.Media.ORIENTATION,
} : new String[0]).flatMap(Stream::of).toArray(String[]::new);
public void fetchAll(Activity activity, EventChannel.EventSink entrySink) {
NewEntryHandler success = entrySink::success;
fetchFrom(activity, success, MediaStore.Images.Media.EXTERNAL_CONTENT_URI, IMAGE_PROJECTION);
fetchFrom(activity, success, MediaStore.Video.Media.EXTERNAL_CONTENT_URI, VIDEO_PROJECTION);
public void fetchAll(Activity activity, NewEntryHandler newEntryHandler) {
fetchFrom(activity, newEntryHandler, MediaStore.Images.Media.EXTERNAL_CONTENT_URI, IMAGE_PROJECTION);
fetchFrom(activity, newEntryHandler, MediaStore.Video.Media.EXTERNAL_CONTENT_URI, VIDEO_PROJECTION);
}
@Override
@ -191,7 +189,7 @@ public class MediaStoreImageProvider extends ImageProvider {
callback.onFailure();
}
private interface NewEntryHandler {
public interface NewEntryHandler {
void handleEntry(Map<String, Object> entry);
}
}