我正在設計出一個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