我想我错过了一些东西,也许你们其中一个人可以给我一个提示。
这就是我所拥有的:
以下是我的想法:
public class DBAdapter {
private static SQLiteDatabase database;
private static boolean isTransactionRunning;
public void beginTransaction() {
database.beginTransaction();
isTransactionRunning = true;
}
public void endTransaction() {
database.setTransactionSuccessful();
database.endTransaction();
isTransactionRunning = false;
}
public void rollbackTransaction() {
database.endTransaction();
isTransactionRunning = false;
}
}
在我的活动中,我打开数据库并启动asynctask
protected class GetUserDataTask extends AsyncTask<Boolean, Bundle, Bundle> {
@Override
protected Bundle doInBackground(Boolean... values) {
db.beginTransaction();
for (Object obj : response.getData()) {
if (isCancelled()) {
return null;
}
///some processing
for (Object obj : response.getData()) {
if (isCancelled()) {
return null;
}
}
@Override
protected void onCancelled() {
super.onCancelled();
if (db.isTransactionRunning()) {
db.rollbackTransaction();
}
}
}
@Override
protected void onPostExecute(Bundle result) {
if (db.isTransactionRunning()) {
if (!error){
db.endTransaction()
} else{
db.rollbackTransaction();
}
}
我取消AsyncTask的错误是:
java.lang.IllegalStateException:无法执行此操作,因为 目前没有交易。
并且它在使用onCancelled()时触发。
我做错了什么?
答案 0 :(得分:1)
为什么有这么多地方可以处理提交/回滚?
我不知道错误发生的原因。
但如果你简化代码,也许它会有所帮助
protected class GetUserDataTask extends AsyncTask<Boolean, Bundle, Bundle> {
@Override
protected Bundle doInBackground(Boolean... values) {
boolean inTransaction = true;
try {
db.beginTransaction();
for (Object obj : response.getData()) {
if (isCancelled()) {
return null;
}
///some processing
}
for (Object obj : response.getData()) {
if (isCancelled()) {
return null;
}
}
if (isCancelled()) {
return null;
}
// every thing worked well without cancel
inTransaction = false;
db.endTransaction();
return processingResult;
} finally {
if (inTransaction) {
db.rollbackTransaction();
}
}
}