3

我正在使用 WorkManager 1.0.0-alpha02

我创建了我的工人阶级,如:

class PrintWorker: Worker(){
  override fun doWork(): WorkerResult {

    try {

        val label: String = inputData.getString(LABEL_ARG_CONTENIDO, null)
        val isLastLabel: Boolean = inputData.getBoolean(LABEL_ARG_IS_LAST,false)

        var result = Printer(applicationContext).print(label)

        var outPut: Data = Data.Builder().putString("PrinterResponse",result.printerResponse).putBoolean(LABEL_ARG_IS_LAST,isLastLabel).build()
        outputData = outPut


        return result.workResult


    }catch (e: Exception){
        return WorkerResult.FAILURE
    }

}


companion object {
    const val LABEL_ARG_CONTENIDO = "Label"
    const val LABEL_ARG_IS_LAST = "Position"
}


}

然后在我的视图模型中,我安排了工作链,例如:

var myQueue: WorkContinuation? = null

    for (label in labelEntities){

        val newPrintWork = OneTimeWorkRequest.Builder(PrintWorker::class.java)

        val builder = Data.Builder()
        var data: Data
        builder.putString(PrintWorker.LABEL_ARG_CONTENIDO, label.contenido)

        if(myQueue == null){
            data = builder.build()
            newPrintWork.setInputData(data)
            myQueue = WorkManager.getInstance().beginUniqueWork(printWorkId,ExistingWorkPolicy.REPLACE,newPrintWork.build())
        }
        else{
            if(labelEntities.indexOf(label) == labelEntities.size - 1)
                builder.putBoolean(PrintWorker.LABEL_ARG_IS_LAST, true)
            data = builder.build()
            newPrintWork.setInputData(data)
            myQueue.then(newPrintWork.build())
        }
    }

    myQueue?.enqueue()

最后在另一段代码中我正在观察它: viewmodel.printStatus.observe(this, Observer { works ->

        if(works!= null){
            if(works.filter { it.state == State.FAILED}.isNotEmpty()){
                MyWorkManager().cancelPrinting()
                context?.let { showDialog(MyAlertDialogManager(it).noMacAddressErrorDialog()) }
            }

            if(works.filter { it.state == State.SUCCEEDED  }.size == works.size &&
                works.isNotEmpty() &&
                works.filter { it.outputData.getBoolean(LABEL_ARG_IS_LAST,false) }.isNotEmpty()){

                context?.let { showDialog(MyAlertDialogManager(it).confirmPrintedCorrectly(factura,this)) }
            }
        }
    })

第一项工作在入队后立即完成并返回 Worker.WorkerResult.SUCCESS 但链的其余部分不会被调用

4

0 回答 0