使用后台服务(runnable)运行2048 kb的游标窗口失败

时间:2018-02-14 02:23:47

标签: android sqlite mobile memory-leaks cursor

我有使用线程后台服务从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)

1 个答案:

答案 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;
}