Почему задачи WorkManager иногда зависают в моем OneTimeWorkRequest? - PullRequest
0 голосов
/ 05 марта 2019

Мне известно, что

Вся фоновая работа дается максимум десять минут для завершения ее выполнения

и что это может занять время в зависимости отнекоторые вещи

Мой код, приведенный ниже, создает 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 для запроса базы данных?

Раньше у меня это было в главном потоке, но были некоторые проблемы.

1 Ответ

0 голосов
/ 05 марта 2019

Вы не можете предполагать, что при работе вашего Worker будет работать Activity.Это потому, что JobScheduler может запустить ваш Worker в фоновом режиме.Вы должны использовать getWorkInfoById() вместо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...