我有使用线程后台服务从SQLite 获取数据2048 kb失败的光标窗口分配
的问题但如果我运行列表branchList = DBTransaction.BranchList(); 没有线程后台服务,此功能正常工作
MyService.Java
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i(TAG, "Service onStartCommand");
new Thread(new Runnable() {
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
@Override
public void run() {
while(true)
{
List<Branch> branchList= DBTransaction.BranchList();
if (branchList.size() < 0)
getBranch(); //get branch using volley get data from web service
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
return START_STICKY;
}
SQLite GetData
public List<Branch> BranchList(){
List<Branch> branchList = new ArrayList<Branch>();
String selectQuery = "SELECT * FROM " + TABLE_BRANCH;
SQLiteDatabase db = getReadableDatabase();
Cursor cursor = null;
try {
cursor = db.rawQuery(selectQuery, null);
if (cursor.moveToFirst()){
do{
Branch branch = new Branch();
branch.setID(cursor.getString(0));
branch.setName(cursor.getString(1));
branch.setCode(cursor.getString(2));
branchList.add(branch);
}while (cursor.moveToNext());
}
}finally {
if(cursor != null)
cursor.close();
}
return branchList;
}
Android监视器的错误结果
E/Volley: [10497] NetworkDispatcher.run: Unhandled exception android.database.CursorWindowAllocationException: Cursor window allocation of 2048 kb failed. # Open Cursors=8 (# cursors opened by this proc=8)
android.database.CursorWindowAllocationException: Cursor window allocation of 2048 kb failed. # Open Cursors=8 (# cursors opened by this proc=8)
答案 0 :(得分:0)
“由于错误,无法分配 ### 大小的 CursorWindow ....”
当游标未关闭并在循环中调用时发生。
如果在您的代码中添加 cursor.close();
不能解决您的问题,
应用我在此答案中给出的严格规则 https://stackoverflow.com/a/65827816/2173890,您将被指向导致问题的那条线。
public List<Branch> BranchList(){
List<Branch> branchList = new ArrayList<Branch>();
String selectQuery = "SELECT * FROM " + TABLE_BRANCH;
SQLiteDatabase db = getReadableDatabase();
Cursor cursor = null;
try {
cursor = db.rawQuery(selectQuery, null);
if (cursor.moveToFirst()){
do{
Branch branch = new Branch();
branch.setID(cursor.getString(0));
branch.setName(cursor.getString(1));
branch.setCode(cursor.getString(2));
branchList.add(branch);
}while (cursor.moveToNext());
}
cursor.close();//如图所示添加这一行。
}finally {
if(cursor != null)
cursor.close();
}
return branchList;
}