我正在设计出一个Android模块,它执行一些处理,然后使用ORMLite事务写入数据库。特别是,我的后台代码将如下所示:取消ORMLite写入后台线程安全
public class BackgroundOperation implements Runnable {
@Override
public void run() {
//Do some stuff
//Write to the database in a transaction
try {
ORMHelper h = ORMHelper.getDefaultOrmHelper();
final MyModel modelObj = h.myModelDao.queryForId(someId);
TransactionManager.callInTransaction(
h.getConnectionSource(),
new Callable<Void>() {
public Void call() throws Exception {
modelObj.col1 = 10;
modelObj.col2 = "hello";
h.myModel2Dao.update(modelObj);
h.myModel2Dao.create(new MyModel2("a", "b"));
return null;
}
}
);
}
catch (Exception e) {
return null;
}
}
}
然后将此runnable提交给ThreadPoolExecutor来执行。我希望能够在需要时取消后台线程,并试图确保如果操作被取消,那么事务将会失败并且什么都不做。例如,如果我这样做:
Future f = myThreadPoolExecutor.submit(new BackgroundOperation());
//Some time later
f.cancel(true);
我可以确定这将是ORMLite中的事务的全部或全部处理。也就是说,没有需要清理,我的modelObj既可以设置col1,也可以设置col2,也可以不设置?在捕获Runnable中的InterruptedException以处理以这种方式取消任务的情况下,我是否必须做任何特别的事情?还是我可以简单地退出?
谢谢格雷...我的例子有点粗心大意/冲,但重点是如何取消Runnable(尊重数据库写入过程中)。我已经更新了两个单独的表格编辑,以确保正确性。从你提到的看来,似乎f.cancel()可能不是可靠取消Runnable操作的方式。想知道是否最好创建一个具有同步状态var的CancelableRunnable子类,该子类指示它是否被取消,并且可以在diff时间检查并用于退出正常的exec路径。 – Faisal
我基本上试图获得相当于目标c的[nsoperation取消]功能......如果我甚至可以在Runnable期间的战略时间检查取消状态并退出,那就没问题。 – Faisal
除了'interrupt()'@Faisal之外,没有办法在运行时停止Java线程。我已经更新了我的答案。 – Gray