错误出在多线程下访问SQLite数据库,同一个sqlite对象已经关闭 别的正在使用。
把接口缓存了,虽然响应速度加快了,但是占用了更多的客户端资源。
android设备空间复杂度增加,由于数据量增长相应的计算时间也增加,
出现多线程下的new 和 close的错误。自己写了一套解决方法。后来上网查资料,发现有更优秀的方式实现。
大概思路就是单例,同步对象。
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import java.util.concurrent.atomic.AtomicInteger;
/**
*多线程下调用SQLite
*
* @author daniel
*
*/
public class DBManager {
//解决多线程并发
private AtomicInteger mOpenCounter = new AtomicInteger();
private static DBManager instance;
private static SQLiteOpenHelper mDatabaseHelper;
private SQLiteDatabase mDatabase;
private DBManager(){
}
/**
* 初始化
* @param helper
*/
public static synchronized void initializeInstance(SQLiteOpenHelper helper) {
if (instance == null) {
instance = new DBManager();
mDatabaseHelper = helper;
}
}
/**
* 获得当前实例对象
* @return
*/
public static synchronized DBManager getInstance() {
if (instance == null) {
throw new IllegalStateException(
DBManager.class.getSimpleName()
+ " is not initialized, call initializeInstance(..) method first.");
}
return instance;
}
/**
* 打开数据库对象
* @return
*/
public synchronized SQLiteDatabase openDatabase() {
if (mOpenCounter.incrementAndGet() == 1) {
// Opening new database
mDatabase = mDatabaseHelper.getWritableDatabase();
}
return mDatabase;
}
/**
* 多线程下关闭
*/
public synchronized void closeDatabase() {
if (mOpenCounter.decrementAndGet() == 0) {
// Closing database
mDatabase.close();
}
}
}
调用方式
//初始化
DBManager.initializeInstance(dbOperHelper);//打开数据库对象替换为
SQLiteDatabase db =DBManager.getInstance().openDatabase();
//关闭替换为
DBManager.getInstance().closeDatabase();