Из моего основного потока я запускаю AsyncTask, который будет проходить через список изображений и для каждого изображения, он будет выполнять некоторую обработку на нем. Итак, в основном, есть цикл for и внутри него, вызывается другая AsyncTask. Я использую экземпляр класса, который содержит логическое значение для проверки, выполняется ли каждое изображение с его обработкой, его называют dummyStructure.Android Threading (AsyncTasks) действует немного странно
Код основного потока:
new BatchProcessor().execute()
doInBackground из BatchProcessor:
protected Void doInBackground(Void... params){
while(dummyStructure.isWorking())
{
//Try loop
thread.sleep(1000);
}
dummyStructure.setIsWorking(true); //basically sets the flag to true
for(String s: pictureList)
{
RunTheProcessingLoop().execute();
}
Проблема: Я пытался отладки, и вот, что проблема имо, если я удалить линии за пределами цикла while dummyStrucutre.setIsWorking(true)
, тогда есть несколько асинхронных вызовов, которые еще до того, как они заканчиваются, и в основном все становится испорченным. Однако, если я не удаляю эту строку, то BatchProcessor
AsyncTask попадает в цикл while, а поскольку RunTheProcessingLoop
AsyncTask никогда не выполняется за пределами своего onPreExecute()
(отлаженный, чтобы знать это, я использовал Log.e()
в каждом методе этой asyncTask).
Определенно, я что-то упускаю, любая помощь? Большое спасибо! :)
Зачем вы вызываете задачу async из другой задачи async? Async в Android - это в основном запланированные задания, которые работают в основной структуре приложения. Это часто позволяет сэкономить ресурсы процессора, убедившись, что все эти виды заданий выполняются из одного механизма планировщика. Когда вы вызываете execute, он добавляет его в очередь расписания, нет никакой логики, чтобы вы не добавляли задание более одного раза в планировщик. – bond
Я понимаю, о чем вы говорите. Но тогда как я могу назвать основной AsyncTask -> 'RunTheProcessingLoop()' из основного потока, а также дождаться его завершения? Я считаю, что мне нужно будет назвать это несколько раз в соответствии с требованиями. : \ –
Не запускайте вещи из основного потока. Ожидание завершения AsyncTask противоречит дизайну AsyncTask в целом. Первое правило AsyncTasks заключается в том, что вся логика, выполняемая AsyncTasks, должна быть доступна из любого места напрямую, а не через ограниченный интерфейс AsyncTask. Это позволяет вам напрямую вызывать различные блоки задач из других задач. Опубликуйте как можно больше кода для этого класса, который вы можете использовать в pastebin, и я исправлю это. – bond