Почему задачи WorkManager иногда зависают в моем OneTimeWorkRequest?

#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. для отмены заданий, если они зависают?