Выполняйте несколько задач одну за другой в цикле - PullRequest
0 голосов
/ 17 мая 2018

У меня есть массив объектов, я хочу для каждого объекта этого массива создать PDF.Для этого я использую цикл, но проблема в том, что он создает мне файл PDF последнего файла.

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

Я хотел бы остановить цикл до тех пор, пока не будет создан файл PDF, затем возобновить следующую итерацию ...

С каждой итерацией я хочу остановить цикл, чтобы дать времядля создания pdf файла

вот мой код:

for (i in 0 until multipleInvoice!!.size) {

            receiveUser = MainActivity.users.find { it.codeZ == multipleInvoice!![i].customerCodeZ }
            products = multipleInvoice!![i].retrieveInvoice(this)
            receiveInvoice = multipleInvoice!![i]

            doAsync {
                // Long background task
                progressBar.setVisible()
                htmlContent = renderHTML()

                uiThread {
                    //webViewInitializer(htmlContent)
                    doAsync {
                        htmlToPDF(htmlContent) //Is function create PDF file on the phone!!!
                        //Here I want to stop the loop until the file is created 
                        // (by the function of the line above). As soon as the file is created, we take the loop 
                    }
                    progressBar.setGone()
                }
            }
        }

1 Ответ

0 голосов
/ 17 мая 2018

Вы не можете использовать любой цикл для достижения того, что вы хотите. Есть способ выполнить то, что вы хотите, используя рекурсию. Если у вас есть несколько Invoice, вызовите эту функцию с 0-й позицией для рендеринга PDF.

if(multipleInvoice?:0 >0)    
  renderInvoice(0)


fun renderInvoice(i:Int) {

        receiveUser = MainActivity.users.find { it.codeZ == multipleInvoice!![i].customerCodeZ }
        products = multipleInvoice!![i].retrieveInvoice(this)
        receiveInvoice = multipleInvoice!![i]

        doAsync {
            // Long background task
            progressBar.setVisible()
            htmlContent = renderHTML()

            uiThread {
                //webViewInitializer(htmlContent)
                doAsync {
                    htmlToPDF(htmlContent) //Is function create PDF file on the phone!!!
                    //Here I want to stop the loop until the file is created 
                    // (by the function of the line above). As soon as the file is created, we take the loop 
                   if(i< multipleInvoice!!.size)
                     renderInvoice(++i)
                }
                progressBar.setGone()
            }
        }
    }
...