Мне известно, что
Вся фоновая работа дается максимум десять минут для завершения ее выполнения
и что это может занять время в зависимости отнекоторые вещи
Мой код, приведенный ниже, создает 8 OneTimeWorkRequests, затем помещает их в то, что, как я надеюсь, представляет собой цепочку, затем ставится в очередь;
workManager.beginWith(deleteCurrent)
.then(deleteCurrentImages)
.then(insertData)
.then(insertImage)
.then(insertAutoNames)
.then(insertAutoCondition)
.then(checkComplete)
.enqueue();
Последний запрос должен завершить текущее действие (если оно достигает этогоВ запросе предполагается, что все задачи выполнены успешно), см. ниже.
public class CheckComplete extends Worker {
@NonNull
@Override
public Result doWork() {
MyApplication myApplication = null;
boolean run = true;
Context context = getActivity();
myApplication = (MyApplication) context.getApplicationContext();
SQLiteConnection mybdc = myApplication.getData();
String jobNo = getInputData().getString("jobNo", "");
String section = getInputData().getString("section", "");
int viewSize = getInputData().getInt("viewSize", 0);
int result = checkLastEntry(jobNo, section,viewSize, mybdc);
if (1 == result) {
getActivity().finish();
return Result.SUCCESS;
} else {
Message.message(context, "Error occurred, please try and save again");
return Result.FAILURE;
}
}
public int checkLastEntry(String jobNo, String section, int viewSize, SQLiteConnection mydbc) {
ArrayList<String> values = new ArrayList<>();
try {
SQLiteStatement mystatement = null;
mystatement = mydbc.prepareStatement("SELECT value FROM documentTable WHERE jobNo = '" + jobNo + "' AND section = '" + section + "'");
while (mystatement.step()) {
values.add(mystatement.getColumnTextNativeString(0));
}
} catch (SQLException ex) {
try {
File path = new File("/sdcard/exports/logs");
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
String currentDateTime = dateFormat.format(new Date()) + " ";
File myFile = new File(path, "DBCrashes.txt");
FileOutputStream fOut = new FileOutputStream(myFile, true);
OutputStreamWriter myOutWriter = new OutputStreamWriter(fOut);
myOutWriter.append("\n" +
"\r");
myOutWriter.append(currentDateTime + " Error reading values: " + ex);
myOutWriter.close();
fOut.close();
return 0;
} catch (java.io.IOException e) {
return 0;
}
}
if(values.size()==viewSize) {
return 1;
}else{
return 0;
}
}
}
Для каждого OneTimeWorkRequests существует класс (кроме insertAutoNames / Condition) Я ставлю точку останова на каждой строке возврата в doWork ().
По какой-то причине, когда я запускаю его, иногда он просто зависает и не достигает следующей строки возврата задач, что может быть причиной этого?
Редактировать: рабочие начинаются, когда нажимается кнопка «сохранить», если она зависает, это должно позволить пользователю снова нажать кнопку сохранения, это приведет к запуску строки ниже, а затем выполнению команд выше, однако это некажется, чтобы отменить темы на работе.
workManager.cancelAllWork();
Должен ли я даже использовать WorkManager для запроса базы данных?
Раньше у меня это было в главном потоке, но были некоторые проблемы.