Android - 使用AsyncTask执行搜索,有时会导致java.lang.IllegalStateException(conn#0)已关闭

时间:2014-11-26 12:51:42

标签: android android-asynctask android-sqlite searchview android-cursor

我已经实施了一项应用,其活动使用searchview中的actionbar

事情是,在现代设备上开发和测试(android 4.4)我从来没有遇到任何问题,但现在我已经在Android 3.0或Android 4.0的某些设备上测试了应用程序,应用程序有时会在搜索时崩溃并给我这个例外:

E/AndroidRuntime(457): Caused by: java.lang.IllegalStateException: database /data/data/com.ss.quicorder/databases/QuickOrder.db (conn# 0) already closed
11-25 11:44:37.864: E/AndroidRuntime(457):  at android.database.sqlite.SQLiteDatabase.verifyDbIsOpen(SQLiteDatabase.java:2117)

这是我用来搜索的代码:

searchView.setOnQueryTextListener(new OnQueryTextListener() {

            @Override
            public boolean onQueryTextChange(String query) {
                if (!query.isEmpty() && query.trim().length()>0) { 
                    displayResults(query);
                }
                else{                   
                    mResultsListView.setAdapter(null);
                }
                return false;

            }

            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }

        });

displayResults 函数只执行AsyncTask:

    private void displayResults(String query) {
        new sSearchCustomers().execute(query);
    }

AsyncTask 查询数据库:

class SearchCustomers extends AsyncTask<String, Void, Cursor> {

        @Override
        protected Cursor doInBackground(String... params) {
            // get the query
            String stringToDisplay = params[0].toLowerCase(Locale.getDefault());
            String stringToSearch = Normalizer.normalize(stringToDisplay,
                    Normalizer.Form.NFC);
            Cursor resultados = SearchCustomersActivity.this.mDB
                    .searchCustomersByName((stringToSearch != null ? stringToSearch
                            : "@@@@"));
            return resultados;

        }

        @Override
        protected void onPostExecute(Cursor result) {           
            if (result != null) {               
                String[] from = new String[] {  
                        QuickOrderDB.CUSTOMER_NAME,
                        QuickOrderDB.CUSTOMER_ADDRESS };

                int[] to = new int[] { 
                        R.id.nameTextView,
                        R.id.addressTextView};

                SimpleCursorAdapter cursorAdapter = new SimpleCursorAdapter(
                        SearchCustomersActivity.this,
                        R.layout.customer_results_item, result, from, to,0);
                mResultsListView.setAdapter(cursorAdapter);             

            }
        }

    }

这是 searchCustomersByName 的代码:

   public Cursor searchCustomersByName (String name {
        String where = CUSTOMER_NAME_NORM + " LIKE ? ";
        String[] whereArgs = { "%" + descripcion + "%"};

        this.openReadableDB();
        Cursor cursor = db.query(CUSTOMER_TABLE, null, where, whereArgs, null,
                null, null);

        if (cursor != null) {
            cursor.moveToFirst();
        }
        this.closeDB();
        return cursor;

    }

正如您在 searchCustomersByName 的代码中看到的,每次我返回Cursor时我都会关闭数据库,但我不确定是否执行{{1}对于用户键入的每个单个字母,它导致了这个问题,我的意思是,是否有一个AsyncTask关闭数据库而另一个执行查询的可能性。 Aren他们应该按顺序执行 ??此外,永远无法关闭光标的事实让我很担心。

与往常一样,任何想法或建议都将受到高度赞赏。

感谢。

0 个答案:

没有答案