#android #android-sqlite #android-workmanager
#Android #android-sqlite #android-workmanager
Вопрос:
Я знаю, что это
На завершение всей фоновой работы отводится максимум десять минут
и что это может занять некоторое время в зависимости от определенных обстоятельств
Мой приведенный ниже код создает 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().
По какой-то причине, когда я запускаю его, иногда он просто зависает и не доходит до строки возврата следующих задач, что может быть причиной этого?
Редактировать: Рабочие запускаются при нажатии кнопки «сохранить», если она зависает, это должно позволить пользователю снова нажать save, это запустит строку ниже, а затем выполнить команды выше, однако, похоже, это не отменяет рабочие потоки.
workManager.cancelAllWork();
Должен ли я вообще использовать WorkManager для запроса базы данных?
Ранее у меня это было в основном потоке, но возникли некоторые проблемы.
Ответ №1:
Вы не можете предположить, что будет Activity
запуск при запуске вашего Worker. Это связано с тем, что JobScheduler
может выполняться Worker
самостоятельно в фоновом режиме. Вместо этого вы должны использовать getWorkInfoById()
.
Комментарии:
1. для отмены заданий, если они зависают?