Я видел много примеров создания / загрузки файлов (особенно здесь и здесь ) ... и каждый из них следует одному из 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 и библиотеки.
Что, если либо, лучше?