Моим советом было бы не ждать, пока вы не почувствуете, что у вас есть общее представление о библиотеке - просто выберите несколько инструментов для начала, а затем переходите по концептуальным ссылкам по ходу работы.
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.
Причина RejectedExecutionException
заключается в том, что AsyncTask
реализует собственный пул потоков (согласно ответу г-на Мартелли), но один это ограничено максимум 10 задачами одновременно. Я понятия не имею, почему у них есть этот предел.
Следовательно, одна из возможностей для вас - клонировать AsyncTask
, поднять лимит (или выйти без ограничений, что также возможно с LinkedBlockingQueue
]) и используйте свой клон. Затем, возможно, отправьте изменение в виде патча для AsyncTask
для будущих выпусков Android.
Щелкните здесь , чтобы запустить поиск кода Google для AsyncTask
- первым попаданием должна быть реализация.
Если вы просто хотите поднять предел, настройте ] MAXIMUM_POOL_SIZE
, чтобы он был настолько большим, насколько вам может понадобиться. Если вы хотите не ограничиваться, используйте конструктор с нулевым аргументом LinkedBlockingQueue
вместо того, который используется сейчас. AFAICT, остальная часть кода, вероятно, останется прежней.
Похоже, вы реализовали версию шаблона проектирования Thread Pool - статья в Википедии указывает на множество полезных статей по этой теме, которые могут помочь вам улучшить вашу реализацию . Я также рекомендую эту статью, посвященную Java , в которой есть четкий код и пояснения.
Возможно, можно сделать так, чтобы задача ждала в блокирующей очереди (растровых изображений) вместо того, чтобы принимать растровое изображение в качестве параметра, но при этом придется добавить способ завершения задачи (задач).