私はいくつかの処理を行い、ORMLiteトランザクションを使用してデータベースに書き込むモジュールをAndroidで設計しています。この実行可能で、その後ThreadPoolExecutorに提出されて実行されます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;
}
}
}
:特に、私のバックグラウンドのコードは次のようになります。必要に応じてバックグラウンドスレッドをキャンセルできるようにしたいのですが、操作がキャンセルされた場合、トランザクションは単に失敗して何もしないことを確認しようとしています。たとえば、私がこれを行う場合:
Future f = myThreadPoolExecutor.submit(new BackgroundOperation());
//Some time later
f.cancel(true);
ORMLiteでのトランザクションの処理はすべて、または何も行われません。つまり、クリーンアップが不要で、modelObjにcol1とcol2の両方が設定されているか、どちらも設定されていませんか?このようにタスクがキャンセルされたときに、RunnableでInterruptedExceptionをキャッチしてケースを処理するには、何か特別な処理を行う必要がありますか?あるいは単に終了できますか?
おかげでグレー...私の例は少し不注意だった/急いだが、焦点はどのようにRunnableをキャンセルする(プロセスでdb書き込みを尊重するか)です。私は、正確さのために2つの別々のテーブル編集でサンプルを更新しました。あなたが言及したところから、f.cancel()はRunnableオペレーションの確実なキャンセルとして行く方法ではないかもしれません。それが取り消され、diff時にチェックされ、通常のexecパスを終了するのに使用されるかどうかを示す、同期状態varを持つCancelableRunnableサブクラスを作成する方がいいかと思います。 – Faisal
私は基本的に目的のcの[nsoperationキャンセル]機能と同等のものを得ようとしています...もしRunnable中に戦略的なタイミングで取り消しステータスをチェックして終了することができればそれは問題ありません。 – Faisal
'interrupt()' @Faisalを除いて実行中にJavaスレッドを停止する方法はありません。私は私の答えを更新しました。 – Gray