gpt4 book ai didi

android - 安全地取消后台线程中的 ORMLite 写入

转载 作者:行者123 更新时间:2023-11-29 00:39:18 26 4
gpt4 key购买 nike

我正在 Android 中设计一个模块,该模块执行一些处理,然后使用 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;
}
}
}

此可运行对象随后将通过提交给 ThreadPoolExecutor 来执行。我希望能够在需要时取消后台线程,并试图确保如果操作被取消,那么事务将简单地失败并且什么都不做。例如,如果我这样做:

Future f = myThreadPoolExecutor.submit(new BackgroundOperation());

//Some time later
f.cancel(true);

我能确定在 ORMLite 中它会是一个全有或全无的交易吗?也就是说,不需要清理,我的 modelObj 要么同时设置 col1 和 col2,要么都不设置?在捕获 Runnable 中的 InterruptedException 以处理以这种方式取消任务的情况时,我是否需要做任何特殊的事情,或者我可以简单地退出?

最佳答案

如果您调用 f.cancel(true),所做的只是中断 Thread,这会导致 wait() sleep(),以及其他一些抛出 InterruptedException 的方法。它不会取消正在进行的数据库事务。

如果需要,您可以检查 IO 操作中间的中断位:

h.myModel2Dao.update(modelObj);
if (Thread.currentThread().isInterrupted()) {
throw new RuntimeException("Thread was interrupted");
}
h.myModel2Dao.create(new MyModel2("a", "b"));

有关线程中断时发生的情况的更多信息,请参见此处:

What does java.lang.Thread.interrupt() do?


事务适用于将多个对象作为一个单元更新或写入多个表的情况。查看documentation about transactions其中有一个在交易中更新 AccountOrder 的示例。

此外,如果您要更新同一行中的多个字段,则不需要使用事务。更新语句被认为是一个单独的单元,数据库应该确保该行被自动更新。仅当您更新同一个表或不同表中的多个不同行时,您才需要事务。

关于android - 安全地取消后台线程中的 ORMLite 写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10490479/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com