Простое управление потоком - Java - Android

Моим советом было бы не ждать, пока вы не почувствуете, что у вас есть общее представление о библиотеке - просто выберите несколько инструментов для начала, а затем переходите по концептуальным ссылкам по ходу работы.

Validation (который, кстати, на самом деле не является монадой ), вероятно, является единственным лучшим местом для начала. Если вы когда-либо использовали Either для проверки в стандартной библиотеке, Validation будет казаться вам знакомым и гораздо более удобным. Вы найдете много полезных обсуждений Validation и здесь в StackOverflow и в других местах .

Когда вы освоитесь с Validation, у вас должно быть хорошее общее представление о классе типов аппликативных функторов, который полезен во многих других контекстах.

Monoid является еще одной хорошей отправной точкой. Это очень простой класс типов (по сути, просто операция, подобная ассоциативному сложению, и элемент идентификации), и как только вы его поймете, вы увидите моноиды повсюду. См., Например, этот ответ (полное раскрытие: он от меня), показывающий, как использовать моноиды для решения проблемы, которая на первый взгляд может показаться не очень моноидальной.

В Scalaz есть множество других полезных маленьких инструментов, которые вы можете использовать, не разбирая всю картину в целом. Bifunctor - один из моих любимых - он делает работу с кортежами намного удобнее, давая вам возможность отобразить функцию по обеим сторонам:

scala> import scalaz._, Scalaz._
import scalaz._
import Scalaz._

scala> def inc(i: Int) = i + 1
inc: (i: Int)Int

scala> def repeat(n: Int)(s: String) = s * n
repeat: (n: Int)(s: String)String

scala> (inc(_)) <-: (1, "a") :-> repeat(3)
res0: (Int, String) = (2,aaa)

Как только вы хорошо разберетесь в нескольких эти концепции я бы предложил в Typeclassopedia Брента Йорджи, который ориентирован на Хаскель, но выполняет фантастическую работу, предоставляя вам достаточно теории категорий и абстрактной алгебры, чтобы понять большинство вещей, которые вы найдете в Scalaz.

8
задан Athira 3 June 2019 в 11:23
поделиться

3 ответа

Причина RejectedExecutionException заключается в том, что AsyncTask реализует собственный пул потоков (согласно ответу г-на Мартелли), но один это ограничено максимум 10 задачами одновременно. Я понятия не имею, почему у них есть этот предел.

Следовательно, одна из возможностей для вас - клонировать AsyncTask , поднять лимит (или выйти без ограничений, что также возможно с LinkedBlockingQueue ]) и используйте свой клон. Затем, возможно, отправьте изменение в виде патча для AsyncTask для будущих выпусков Android.

Щелкните здесь , чтобы запустить поиск кода Google для AsyncTask - первым попаданием должна быть реализация.

Если вы просто хотите поднять предел, настройте ] MAXIMUM_POOL_SIZE , чтобы он был настолько большим, насколько вам может понадобиться. Если вы хотите не ограничиваться, используйте конструктор с нулевым аргументом LinkedBlockingQueue вместо того, который используется сейчас. AFAICT, остальная часть кода, вероятно, останется прежней.

12
ответ дан 5 December 2019 в 11:26
поделиться

Похоже, вы реализовали версию шаблона проектирования Thread Pool - статья в Википедии указывает на множество полезных статей по этой теме, которые могут помочь вам улучшить вашу реализацию . Я также рекомендую эту статью, посвященную Java , в которой есть четкий код и пояснения.

3
ответ дан 5 December 2019 в 11:26
поделиться

Возможно, можно сделать так, чтобы задача ждала в блокирующей очереди (растровых изображений) вместо того, чтобы принимать растровое изображение в качестве параметра, но при этом придется добавить способ завершения задачи (задач).

0
ответ дан 5 December 2019 в 11:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: