如果我沒有弄錯,Google已經啓用了AsyncTasks以提高執行速度並行運行,但有幾個Android API(在donut之後,蜂窩之前)。然後,很多開發人員在使用多個AsyncTasks訪問同一個數據庫時犯了錯誤,而且由於Android 3.0 AsyncTasks默認是串行運行的。如何在Android 2.x中強制串行/順序執行AsyncTasks
我與我的SQLite
首先,即時得到類別的服務器,我打開數據庫,將它們插入接近DB在Android 2.3.4設備上測試我的應用程序時的痛苦,現在這個問題。
其次,我從服務器獲取的子類別,打開數據庫,將它們插入到數據庫,靠近DB
第三我從服務器上,打開數據庫用戶的項目,插入項目,然後關閉DB
我正在小心翼翼地確保一個接一個地開始,但是在每個8-10次迭代中,某個地方的任務放慢並與另一個程序重疊,此時任務正在打開數據庫,另一個任務將在其後立即關閉,第一個任務開始嘗試寫入一個封閉的分貝....
我該怎麼辦?我想幹淨,可靠的分離,順序執行,我不想從以前的asynctask的onPostExecute啓動asynctasks,因爲這三個不會總是連續運行
我昨天讀了一篇文章,你可以在android 2上做到這一點.x
我應該嘗試在所有操作之前打開DB和DBHelper,然後關閉DB?
編輯:通常我得到的錯誤在這裏(在開始交易): (錯誤說,DB被關閉)
@Override
protected Void doInBackground(Void... arg0) {
// dbTools.close();
try {
if (database == null) {
database = dbTools.getWritableDatabase();
}
} catch (Exception e) {
e.printStackTrace();
}
ContentValues values = new ContentValues();
database.beginTransaction();
try {
// Iterating all UserItem objects from the LinkedHashSet and getting their info
for (UserItem userItem : userItems) {
// Inserting values for the database to insert in a new record
values.put(C.DBColumns.ITEM_ID, userItem.getItemId());
values.put(C.DBColumns.ITEM_NAME, userItem.getItemName());
// database.insertWithOnConflict(C.DBTables.ITEMS, null, values, SQLiteDatabase.CONFLICT_REPLACE);
database.insert(C.DBTables.ITEMS, null, values);
} // End of For loop
database.setTransactionSuccessful();
} finally {
database.endTransaction();
}
// Closing all cursors, databases and database helpers properly because not closing them can spring lots of trouble.
if (database != null && database.isOpen()) {
try {
database.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
} // End of doInBackground
,這是我的DBTools類:
public class DBTools extends SQLiteOpenHelper {
// Its a good practice for DBTools to be a singleton. Do not instantiate it with "new DBTools(context)" but with
// DBTools.getInstance(context) instead
private static DBTools sInstance;
public static DBTools getInstance(Context context) {
if (sInstance == null) {
sInstance = new DBTools(context);
}
return sInstance;
}
public DBTools(Context context) {
super(context, C.Preferences.LOCAL_SQLITE_DATABASE_NAME, null, 1);
}
public void onCreate(SQLiteDatabase database) {
database.execSQL(SQLQueries.tableCategoriesCreate);
database.execSQL(SQLQueries.tableSubcategoriesCreate);
database.execSQL(SQLQueries.tableItemsCreate);
}
public void onOpen(SQLiteDatabase database) {
database.execSQL(SQLQueries.tableCategoriesCreate);
database.execSQL(SQLQueries.tableSubcategoriesCreate);
database.execSQL(SQLQueries.tableItemsCreate);
}
public void onUpgrade(SQLiteDatabase database, int version_old, int current_version) {
database.execSQL(SQLQueries.tableCategoriesDrop);
database.execSQL(SQLQueries.tableSubcategoriesDrop);
database.execSQL(SQLQueries.tableItemsDrop);
onCreate(database);
}
} // End of Class
是選項B equivallent以使DBTool中一個單身? –
你需要使用一個單身,但它不只是一個問題使它成爲一個單例我已經添加了一些代碼以供參考 – Ben
因此在openCount> 1時調用forceDBClose –