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) { public void onMethodCall(@NonNull MethodCall call, @NonNull MethodChannel.Result result) {
switch (call.method) { switch (call.method) {
case "getImageEntries": case "getImageEntries":
mediaStoreStreamHandler.fetchAll(activity); new Thread(() -> mediaStoreStreamHandler.fetchAll(activity)).start();
result.success(null); result.success(null);
break; break;
case "getImageEntry": case "getImageEntry":
getImageEntry(call, result); new Thread(() -> getImageEntry(call, new MethodResultWrapper(result))).start();
break; break;
case "readAsBytes": case "readAsBytes":
readAsBytes(call, result); new Thread(() -> readAsBytes(call, new MethodResultWrapper(result))).start();
break; break;
case "getImageBytes": case "getImageBytes":
getImageBytes(call, result); new Thread(() -> getImageBytes(call, new MethodResultWrapper(result))).start();
break; break;
case "cancelGetImageBytes": case "cancelGetImageBytes":
cancelGetImageBytes(call, result); new Thread(() -> cancelGetImageBytes(call, new MethodResultWrapper(result))).start();
break; break;
case "delete": case "delete":
delete(call, result); new Thread(() -> delete(call, new MethodResultWrapper(result))).start();
break; break;
case "rename": case "rename":
rename(call, result); new Thread(() -> rename(call, new MethodResultWrapper(result))).start();
break; break;
case "rotate": case "rotate":
rotate(call, result); new Thread(() -> rotate(call, new MethodResultWrapper(result))).start();
break; break;
default: default:
result.notImplemented(); result.notImplemented();

View file

@ -1,6 +1,8 @@
package deckers.thibault.aves.channelhandlers; package deckers.thibault.aves.channelhandlers;
import android.app.Activity; import android.app.Activity;
import android.os.Handler;
import android.os.Looper;
import android.util.Log; import android.util.Log;
import deckers.thibault.aves.model.provider.MediaStoreImageProvider; import deckers.thibault.aves.model.provider.MediaStoreImageProvider;
@ -27,8 +29,9 @@ public class MediaStoreStreamHandler implements EventChannel.StreamHandler {
void fetchAll(Activity activity) { void fetchAll(Activity activity) {
Log.d(LOG_TAG, "fetchAll start"); Log.d(LOG_TAG, "fetchAll start");
// Instant start = Instant.now(); // Instant start = Instant.now();
new MediaStoreImageProvider().fetchAll(activity, eventSink); // 350ms Handler handler = new Handler(Looper.getMainLooper());
eventSink.endOfStream(); 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"); // 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.PermissionManager;
import deckers.thibault.aves.utils.StorageUtils; import deckers.thibault.aves.utils.StorageUtils;
import deckers.thibault.aves.utils.Utils; import deckers.thibault.aves.utils.Utils;
import io.flutter.plugin.common.EventChannel;
public class MediaStoreImageProvider extends ImageProvider { public class MediaStoreImageProvider extends ImageProvider {
private static final String LOG_TAG = Utils.createLogTag(MediaStoreImageProvider.class); private static final String LOG_TAG = Utils.createLogTag(MediaStoreImageProvider.class);
@ -57,10 +56,9 @@ public class MediaStoreImageProvider extends ImageProvider {
MediaStore.Video.Media.ORIENTATION, MediaStore.Video.Media.ORIENTATION,
} : new String[0]).flatMap(Stream::of).toArray(String[]::new); } : new String[0]).flatMap(Stream::of).toArray(String[]::new);
public void fetchAll(Activity activity, EventChannel.EventSink entrySink) { public void fetchAll(Activity activity, NewEntryHandler newEntryHandler) {
NewEntryHandler success = entrySink::success; fetchFrom(activity, newEntryHandler, MediaStore.Images.Media.EXTERNAL_CONTENT_URI, IMAGE_PROJECTION);
fetchFrom(activity, success, MediaStore.Images.Media.EXTERNAL_CONTENT_URI, IMAGE_PROJECTION); fetchFrom(activity, newEntryHandler, MediaStore.Video.Media.EXTERNAL_CONTENT_URI, VIDEO_PROJECTION);
fetchFrom(activity, success, MediaStore.Video.Media.EXTERNAL_CONTENT_URI, VIDEO_PROJECTION);
} }
@Override @Override
@ -191,7 +189,7 @@ public class MediaStoreImageProvider extends ImageProvider {
callback.onFailure(); callback.onFailure();
} }
private interface NewEntryHandler { public interface NewEntryHandler {
void handleEntry(Map<String, Object> entry); void handleEntry(Map<String, Object> entry);
} }
} }