Как избежать ANR с помощью курсоров - PullRequest
1 голос
/ 16 июня 2011

У меня есть действие, которое выполняет запрос к Sqlite DB, получает курсор, создает с помощью этого курсора CustomCursorAdapter и присоединяет его к ListView в действии.Это выглядит так:

SQLiteDatabase db=new StuffHelper(this).getWritableDatabase();
Cursor c1=db.query(StuffHelper.TABLE,
            new String[]{StuffHelper._ID},
            StuffHelper.SIZE+">=?",
            new String[]{"64"},
            null,
            null,
            null);
startManagingCursor(c1);

StuffAdapter a1 = new StuffAdapter(this, c1);

ListView ll1 = (ListView) findViewById(R.id.ll1);
ll1.setAdapter(a1);

Является ли эта текущая настройка проблемой с точки зрения ANR?Когда я использую курсоры, как я могу сказать android запускать все компоненты Sqlite в фоновом потоке?

Ответы [ 2 ]

1 голос
/ 16 июня 2011

Вы не дали много контекста о том, когда этот код запускается, но я все равно укушу ...

Да, это действительно риск ANR.Это также подвергает риску другие проблемы жизненного цикла.Поскольку setListAdapter() должен вызываться раньше, чем другие обычные вещи, которые вы обычно делаете в onCreate(), вы, вероятно, захотите разгрузить доступ к базе данных в отдельный поток (например, AsyncTask), который может вызываться / кэшироваться / управляться по мере необходимости.AsyncTask предоставляет вам обратный вызов на основе пользовательского интерфейса до начала потока и обратный вызов на основе пользовательского интерфейса, когда поток заканчивается.ListAdapter может быть создан и назначен без каких-либо ссылок на Курсор (и я бы посоветовал вам исправить это как можно скорее ... По-видимому, нет веской причины, по которой вы используете настраиваемый адаптер списка, вам следует управлятьвместо этого ваш доступ к базе данных лучше).

Управление этой задачей с помощью разрыва деятельности и восстановления (подумайте об изменении ориентации ...) - это совершенно другой шарик воска, который был покрыт до тошноты на SO.

0 голосов
/ 16 июня 2011

Пожалуйста, отделите ваш интерфейс от фоновых задач. Запишите часть курсора в фоновом режиме, а в forground вы можете отобразить любой пользовательский интерфейс или диалог прогресса. Используйте AsyncTask для этого

В классе AsyncTask есть следующие методы

1. doInBackground: Code performing long running operation goes in this method.  When onClick method is executed on click of button, it calls execute method which accepts parameters and automatically calls doInBackground method with the parameters passed.
   2. onPostExecute: This method is called after doInBackground method completes processing. Result from doInBackground is passed to this method.
   3. onPreExecute: This method is called before doInBackground method is called.
   4. onProgressUpdate: This method is invoked by calling publishProgress anytime from doInBackground call this method.

Как использовать AsyncTask

Спасибо Дипак

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...