Google Drive: как загрузить данные в DriveContents в цепочке задач? - PullRequest
0 голосов
/ 03 октября 2018

Я видел много примеров создания / загрузки файлов (особенно здесь и здесь ) ... и каждый из них следует одному из 2 шаблонов:

a) как в связанных примерах, напишите в OutputConream DriveContents в методе создания / лямбда следующей задачи после createContents ().За исключением загрузки в потоке пользовательского интерфейса .

b) обернуть все создание файла в AsyncTask.

Как лучше переписать пример для запуска этой частив отдельном потоке, сохраняя при этом выполнение в виде цепочки задач?

Одна из идей, которую я имею, состоит в том, чтобы добавить ThreadPoolExecutor в качестве параметра continueWithTask:

Executor executor = new ThreadPoolExecutor(0, 8,
        60L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
...
Tasks.whenAll(rootFolderTask, createContentsTask)
            .continueWithTask(executor, task -> {
...

Другая задача включает TaskCompletionSource из потока:

final Task<DriveContents> fillContentsTask =
        createContentsTask.continueWithTask(task -> {
            DriveContents contents = task.getResult();
            final TaskCompletionSource<DriveContents> source = new TaskCompletionSource<>();
            new Thread(() -> {
                try (OutputStream outputStream = contents.getOutputStream();
                     Writer writer = new OutputStreamWriter(outputStream)){
                    writer.write("Hello World!");
                } catch (IOException e) {
                    source.setException(e);
                    return;
                }
                source.setResult(contents);
            }).start();
            return source.getTask();
});

Tasks.whenAll(rootFolderTask, fillContentsTask)
...

Ни один из них не выглядит особенно элегантно, и потоки, и исполнители являются деталями реализации, которые обычно стремятся скрыть различные API и библиотеки.

Что, если либо, лучше?

...