为什么有时WorkManager任务在我的OneTimeWorkRequest中挂起?

时间:2019-03-05 09:36:08

标签: 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()的每条返回线上都设置了一个断点。

由于某种原因,当我运行它时,它有时会挂起并且无法到达下一个任务返回行,这可能是什么原因导致的?

编辑:工作程序在按下“保存”按钮时开始,如果挂起,则应该允许用户再次按下保存,这将在下面的行中运行,然后在上面的命令中运行,但是似乎并没有取消工作线程。

workManager.cancelAllWork();

我什至应该使用WorkManager来查询数据库吗?

以前,我在主线程上安装了它,但是遇到了一些问题。

1 个答案:

答案 0 :(得分:0)

您不能假设运行Worker时将运行Activity。这是因为JobScheduler可能会在后台单独运行Worker。您应该改用getWorkInfoById()