2011-01-27 2 views
4

моего приложения имеет иерархию деятельности, A -launches- B -launches- CSQLite исключения на возобновление Android активности

В третьей операции «C» У меня есть кнопка.

В onClickListener этой кнопки я запускаю Intent следующим образом:

Intent intent = new Intent(Intent.ACTION_DIAL); 
intent.setData(Uri.parse(uri)); 
startActivity(intent); 
//I don't call finish() 

Он поднимает трубку набора диалоговое штраф. Если я нажму кнопку «Назад», я получу «Извините!». всплывающее сообщение о том, что мое приложение неожиданно остановилось. При нажатии кнопки «Принудительное закрытие» мое приложение возвращается к активности «B», а не к ожидаемому «C» (если не считать сбоя).

Активность «B» использует SQL-запрос, указанный в исключении, но я не знаю, почему он вызывает исключение, когда я нажимаю «Назад», поскольку он не имеет ничего общего с Activity C. Моя база данных закрыта, и я не получаю предупреждения об утечке.

В операции «B» база данных открывается непосредственно перед выполнением запроса и закрывается после этого. Борясь с этим весь день, так оценил бы любые комментарии.

Uncaught handler: thread main exiting due to uncaught exception 
java.lang.IllegalStateException: mQuery SELECT islocal, packageid, Name, mapradius FROM categories WHERE islocal=? 1 
    at android.database.sqlite.SQLiteQuery.requery(SQLiteQuery.java:162) 
    at android.database.sqlite.SQLiteCursor.requery(SQLiteCursor.java:536) 
    at android.app.Activity.performRestart(Activity.java:3740) 
    at android.app.ActivityThread.handleWindowVisibility(ActivityThread.java:3312) 
    at android.app.ActivityThread.access$2600(ActivityThread.java:123) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1890) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:123) 
    at android.app.ActivityThread.main(ActivityThread.java:4370) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:521) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
    at dalvik.system.NativeStart.main(Native Method) 
Caused by: android.database.sqlite.SQLiteMisuseException: library routine called out of sequence: handle 0x0 
    at android.database.sqlite.SQLiteProgram.native_bind_string(Native Method) 
    at android.database.sqlite.SQLiteProgram.bindString(SQLiteProgram.java:178) 
    at android.database.sqlite.SQLiteQuery.requery(SQLiteQuery.java:153) 
    ... 13 more 
ERROR/SemcCheckin(17282): Get crash dump level : java.io.FileNotFoundException: /data/semc-checkin/crashdump 

ответ

7

Я просто решил это исключение в своем приложении. Не уверен, была ли причина такой же, как у вас ...

Активность А выполняла запрос JOIN на 2 таблицы в базе данных через таблицу мостов. Записи из этого объединения были помещены в ListView, и когда пользователь нажимает на запись, мое приложение отключается от Activity B. Когда вы нажимаете кнопку «Назад» в Activity B, возобновляя Activity A, это исключение произошло.

Исправление заключалось в том, чтобы явно закрыть курсор (cur.close()) в Activity A, когда он завершил получение данных. До того, как я только закрыл БД.

Это НЕ произошло, если операция А выполнила базовый запрос без JOIN. Поэтому, когда вы присоединяетесь к нескольким таблицам и возвращаетесь в курсор, запрос, который система выполняет на этом открытом курсоре, когда ваша задача возобновляется, генерирует это исключение. Вы должны явно закрыть курсор, чтобы возобновить новый. Другим фактором, который мог вызвать это, является то, что мой доступ к БД в Activity A происходит на отдельном рабочем потоке.

+0

Спасибо, что нашли время, чтобы опубликовать свой комментарий. Это имеет немного больше смысла, чем мое объяснение, и дает лучший ответ, поэтому я меняю ответ. Приветствую Крейга. – androider

1

Проблема оказалась проблемой параллелизма, связанной с открытыми подключениями к базе данных. Все еще не совсем уверен в первопричине, поскольку я всегда закрывал свои подключения. В любом случае, я создал одно соединение, общее для всех видов деятельности, и проблема исчезла.

Смежные вопросы