Anonymous
Задания Workmanager перестают работать или не завершаются с третьей или четвертой попытки
Сообщение
Anonymous » 19 ноя 2024, 14:32
Работу, которую я выполняю с помощью WorkManager, я использую для хранения данных в фоновом режиме, и когда задача завершена, приложение уведомляет меня. На третий или четвертый раз запускаю задание, оно перестает работать. Я могу остановить его вручную, но он никогда не завершается. Вот мой код, который помогал мне создавать, выполнять и видеть статус работы:
Код: Выделить всё
private void sincronizar()
{
Log.d("Message ::","Sincronizando");
manager = WorkManager.getInstance(getActivity());
manager.enqueueUniqueWork("startW",ExistingWorkPolicy.KEEP,startWork);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
viewModel.setLoading(true);
viewModel.setRegistroSync(tag);
int sum = 0;
if(cbCobros.isChecked()) {
manager.enqueueUniqueWork("cobroW", ExistingWorkPolicy.KEEP,cobroWork);
sum++;
}
if(cbPedidos.isChecked()) {
manager.enqueueUniqueWork("pedidoW", ExistingWorkPolicy.KEEP,pedidoWork);
sum++;
}
if (cbEmpresas.isChecked()) {
manager.enqueueUniqueWork("empresaW", ExistingWorkPolicy.KEEP,empresaWork);
sum++;
}
if(cbMonedas.isChecked()) {
manager.enqueueUniqueWork("monedaW", ExistingWorkPolicy.KEEP,monedaWork);
sum++;
}
if(cbDocumentos.isChecked()) {
manager.enqueueUniqueWork("documentoW", ExistingWorkPolicy.KEEP,documentoWork);
sum++;
}
if(cbPerfil.isChecked()) {
manager.enqueueUniqueWork("perfilW", ExistingWorkPolicy.KEEP,perfilWork);
sum++;
}
if(cbCatalogo.isChecked()) {
manager.enqueueUniqueWork("catalogoW", ExistingWorkPolicy.KEEP,catalogoWork);
sum++;
}
if(cbDatosempresa.isChecked()) {
manager.enqueueUniqueWork("datosW", ExistingWorkPolicy.KEEP,datosWork);
sum++;
}
if(cbConfig.isChecked()) {
manager.enqueueUniqueWork("configW", ExistingWorkPolicy.KEEP,configWork);
sum++;
}
if(cbVisitas.isChecked()) {
manager.enqueueUniqueWork("visitaW", ExistingWorkPolicy.KEEP,visitaWorker);
sum++;
}
if(cbCotizaciones.isChecked()) {
manager.enqueueUniqueWork("cotizacionW", ExistingWorkPolicy.KEEP,cotizacionWork);
sum++;
}
if(cbSurtir.isChecked()) {
manager.enqueueUniqueWork("surtirW", ExistingWorkPolicy.KEEP,surtirWork);
sum++;
}
if(cbEntrega.isChecked()) {
manager.enqueueUniqueWork("entregaW", ExistingWorkPolicy.KEEP,entregaWork);
sum++;
}
if(cbFacturas.isChecked()) {
manager.enqueueUniqueWork("facturaW", ExistingWorkPolicy.KEEP,facturaWork);
sum++;
}
if(cbClientes.isChecked()) {
manager.enqueueUniqueWork("clienteW", ExistingWorkPolicy.KEEP,clientWork);
sum++;
}
if(cbArticulo.isChecked()) {
manager.enqueueUniqueWork("articuloW", ExistingWorkPolicy.KEEP,articuloWork);
sum++;
}
if(cbFormasPago.isChecked()) {
manager.enqueueUniqueWork("formasPagoW", ExistingWorkPolicy.KEEP,formasPagoWork);
sum++;
}
if(cbVentas.isChecked()) {
manager.enqueueUniqueWork("ventasW", ExistingWorkPolicy.KEEP,ventasWork);
sum++;
}
if(cbCajas.isChecked()) {
manager.enqueueUniqueWork("cajasW", ExistingWorkPolicy.KEEP,cajasWork);
sum++;
}
tvProgress.setText("Sincronizando...");
if(sum == 0)
{
viewModel.setLoading(false);
viewModel.updateRegistroSync(tag);
}
else{
tvCancelar.setVisibility(View.VISIBLE);
}
AtomicInteger sumW = new AtomicInteger();
manager.getWorkInfosByTagLiveData(tag)
.observe(getViewLifecycleOwner(), workInfos -> {
if (workInfos != null) {
int count = workInfos.size();
sumW.set(0);
workInfos.forEach(workInfo -> {
Log.d("Message :::", "Work: " + workInfo.getTags() + ", State: " + workInfo.getState());
if(workInfo.getState() == WorkInfo.State.SUCCEEDED)
{
sumW.getAndIncrement();
}
Log.d("Message :::","sum: " + sumW.intValue() + ", count: " + count);
if(sumW.intValue() == count)
{
getInfoRegistered();
viewModel.setLoading(false);
tvProgress.setText("Sincronización completa");
manager.enqueue(finishWork);
WorkerUtils.makeSuccessNotification("Sincronización completa", getActivity());
manager.pruneWork();
}
});
workInfos.stream().forEach(workInfo -> {
Data progress = workInfo.getProgress();
int value = progress.getInt("PROGRESS", 0);
if(value > 0)
{
pbLoading.setVisibility(View.VISIBLE);
pbLoading.setProgress((int) value,true);
}
} );
}
});
}
Я пытался очистить его с помощью команды Manager.pruneWork() , но это не устранило проблему.
Подробнее здесь:
https://stackoverflow.com/questions/780 ... th-attempt
1732015935
Anonymous
Работу, которую я выполняю с помощью WorkManager, я использую для хранения данных в фоновом режиме, и когда задача завершена, приложение уведомляет меня. На третий или четвертый раз запускаю задание, оно перестает работать. Я могу остановить его вручную, но он никогда не завершается. Вот мой код, который помогал мне создавать, выполнять и видеть статус работы: [code] private void sincronizar() { Log.d("Message ::","Sincronizando"); manager = WorkManager.getInstance(getActivity()); manager.enqueueUniqueWork("startW",ExistingWorkPolicy.KEEP,startWork); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } viewModel.setLoading(true); viewModel.setRegistroSync(tag); int sum = 0; if(cbCobros.isChecked()) { manager.enqueueUniqueWork("cobroW", ExistingWorkPolicy.KEEP,cobroWork); sum++; } if(cbPedidos.isChecked()) { manager.enqueueUniqueWork("pedidoW", ExistingWorkPolicy.KEEP,pedidoWork); sum++; } if (cbEmpresas.isChecked()) { manager.enqueueUniqueWork("empresaW", ExistingWorkPolicy.KEEP,empresaWork); sum++; } if(cbMonedas.isChecked()) { manager.enqueueUniqueWork("monedaW", ExistingWorkPolicy.KEEP,monedaWork); sum++; } if(cbDocumentos.isChecked()) { manager.enqueueUniqueWork("documentoW", ExistingWorkPolicy.KEEP,documentoWork); sum++; } if(cbPerfil.isChecked()) { manager.enqueueUniqueWork("perfilW", ExistingWorkPolicy.KEEP,perfilWork); sum++; } if(cbCatalogo.isChecked()) { manager.enqueueUniqueWork("catalogoW", ExistingWorkPolicy.KEEP,catalogoWork); sum++; } if(cbDatosempresa.isChecked()) { manager.enqueueUniqueWork("datosW", ExistingWorkPolicy.KEEP,datosWork); sum++; } if(cbConfig.isChecked()) { manager.enqueueUniqueWork("configW", ExistingWorkPolicy.KEEP,configWork); sum++; } if(cbVisitas.isChecked()) { manager.enqueueUniqueWork("visitaW", ExistingWorkPolicy.KEEP,visitaWorker); sum++; } if(cbCotizaciones.isChecked()) { manager.enqueueUniqueWork("cotizacionW", ExistingWorkPolicy.KEEP,cotizacionWork); sum++; } if(cbSurtir.isChecked()) { manager.enqueueUniqueWork("surtirW", ExistingWorkPolicy.KEEP,surtirWork); sum++; } if(cbEntrega.isChecked()) { manager.enqueueUniqueWork("entregaW", ExistingWorkPolicy.KEEP,entregaWork); sum++; } if(cbFacturas.isChecked()) { manager.enqueueUniqueWork("facturaW", ExistingWorkPolicy.KEEP,facturaWork); sum++; } if(cbClientes.isChecked()) { manager.enqueueUniqueWork("clienteW", ExistingWorkPolicy.KEEP,clientWork); sum++; } if(cbArticulo.isChecked()) { manager.enqueueUniqueWork("articuloW", ExistingWorkPolicy.KEEP,articuloWork); sum++; } if(cbFormasPago.isChecked()) { manager.enqueueUniqueWork("formasPagoW", ExistingWorkPolicy.KEEP,formasPagoWork); sum++; } if(cbVentas.isChecked()) { manager.enqueueUniqueWork("ventasW", ExistingWorkPolicy.KEEP,ventasWork); sum++; } if(cbCajas.isChecked()) { manager.enqueueUniqueWork("cajasW", ExistingWorkPolicy.KEEP,cajasWork); sum++; } tvProgress.setText("Sincronizando..."); if(sum == 0) { viewModel.setLoading(false); viewModel.updateRegistroSync(tag); } else{ tvCancelar.setVisibility(View.VISIBLE); } AtomicInteger sumW = new AtomicInteger(); manager.getWorkInfosByTagLiveData(tag) .observe(getViewLifecycleOwner(), workInfos -> { if (workInfos != null) { int count = workInfos.size(); sumW.set(0); workInfos.forEach(workInfo -> { Log.d("Message :::", "Work: " + workInfo.getTags() + ", State: " + workInfo.getState()); if(workInfo.getState() == WorkInfo.State.SUCCEEDED) { sumW.getAndIncrement(); } Log.d("Message :::","sum: " + sumW.intValue() + ", count: " + count); if(sumW.intValue() == count) { getInfoRegistered(); viewModel.setLoading(false); tvProgress.setText("Sincronización completa"); manager.enqueue(finishWork); WorkerUtils.makeSuccessNotification("Sincronización completa", getActivity()); manager.pruneWork(); } }); workInfos.stream().forEach(workInfo -> { Data progress = workInfo.getProgress(); int value = progress.getInt("PROGRESS", 0); if(value > 0) { pbLoading.setVisibility(View.VISIBLE); pbLoading.setProgress((int) value,true); } } ); } }); } [/code] Я пытался очистить его с помощью команды Manager.pruneWork() , но это не устранило проблему. Подробнее здесь: [url]https://stackoverflow.com/questions/78089157/workmanager-jobs-stop-working-or-do-not-complete-on-a-third-or-fourth-attempt[/url]