Асинхронная функция с несколькими параметрами - PullRequest
0 голосов
/ 22 января 2020

В настоящее время у меня есть следующая кодировка:

outputData = parseData(in_data, category, lastKey, firstKey);
return outputData.indexOf("true");

parseData вернет ArrayList.outputData это ArrayList.

Я хотел преобразовать приведенный выше код для асинхронной работы, потому что parseData занимает много времени для обработки.

Мои основные вопросы:

  • Мне нужно решение для асинхронной обработки, которое принимает несколько переменных и выдает ArrayList
  • Вторая строка кодов не может быть выполнять до тех пор, пока parseData не будет завершен асинхронно.

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

Ответы [ 2 ]

0 голосов
/ 22 января 2020

Таким образом, вы хотите, чтобы код выполнялся асинхронно и записывал результат в переменную outputData спустя некоторое время после завершения всех вычислений. Во-первых, если outputData является локальной переменной, это просто невозможно. Во-вторых, если outputData является полем, это возможно, но не удобно: когда вы в конечном итоге захотите использовать это значение, как вы узнаете, что асинхронное вычисление завершено? Таким образом, чтобы справиться с этой ситуацией, был разработан интерфейс java.util.concurrent.Future.

Обычный подход для вызова такого изолированного асинхронного кода заключается в использовании ExecutorService.submit(Callable), который возвращает Future. Когда вам нужен результат вычисления, вы вызываете Future.get() и ждете, пока результат не будет вычислен:

ExecutorService pool = ForkJoinPool.commonPool(); // or use any other ExecutorService 
Callable<ArrayList> function = ()->parseData(in_data, category, lastKey, firstKey);
Future<ArrayList> future = pool.submit(function); // computation started in parallel, we can do other work
...
ArrayList res = future.get(); // when we eventually need the result of asynchronous computation
0 голосов
/ 22 января 2020

вот как вы можете это сделать:

  1. AsyncTask : вы можете сделать свои параметры в объекте, затем вы можете использовать его
  2. HandlerThread
  3. JobScheduler

    Это API для планирования различных типов заданий в рамках инфраструктуры, которая будет выполняться в собственном процессе вашего приложения.

для подробностей, вы можете увидеть этот блог

ExecutorService и Handler для реализации функции Вы также можете использовать решение Rx Java для реализации этой функции. Вы можете прочитать этот блог , чтобы выучить его.

, если заданию не нужно слишком много времени, вы можете использовать AsyncTask, потому что его легко использовать

...