我知道
所有后台工作最多需要十分钟才能完成执行
根据某些情况可能会花费一些时间
我的下面代码创建了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来查询数据库吗?
以前,我在主线程上安装了它,但是遇到了一些问题。
答案 0 :(得分:0)
您不能假设运行Worker时将运行Activity
。这是因为JobScheduler
可能会在后台单独运行Worker
。您应该改用getWorkInfoById()
。