Android aSyncTask и запуск другого действия - PullRequest
0 голосов
/ 27 сентября 2011

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

  private class initialDBQuery extends AsyncTask<SQLiteDatabase, Void, Cursor> {

    @Override
    protected Cursor doInBackground(SQLiteDatabase... params) {
        final SQLiteDatabase mDatabase = params[0];
        mCursor = mDatabase.rawQuery("SELECT * FROM database", null);
        return mCursor;
    }

    @Override
    protected void onPostExecute(Cursor c){

        ParentActivity.this.mCursor = mCursor; 
        ParentActivity.this.updateQuery();
        mDatabase.close(); //Close database connection ASAP
    }

    // can use UI thread here
    protected void onPreExecute() {
        ParentActivity.this.mAnimalPager = null;
        Toast.makeText(ParentActivity.this.getBaseContext(), "Loading Database...", Toast.LENGTH_SHORT).show();
    }
} 

В моем основном пользовательском интерфейсе есть несколько кнопок, которые ведут к различным действиям, функция которых заключается в предоставлении критериев поиска через намерения к основному действию (ParentActivity), которое затем выполняет поиск. остальная часть основного действия - просмотрщик, который зависит от курсора, возвращаемого из AsyncTask (обновление работает нормально).

Моя проблема заключается в том, что: с этим кодом i я нажимаю одну из экранных кнопок (запускаю другое действие) во время выполнения асинхронной задачи, затем получаю сообщение об ошибке «Невозможно приостановить действие».

Какие дальнейшие шаги мне нужно предпринять, чтобы справиться с запуском AsyncTask, когда приложение остановится?

спасибо, м

Ответы [ 2 ]

1 голос
/ 28 сентября 2011

Проблема, с которой я столкнулся здесь, была связана с моим пейджером на основной активности.

Поскольку AsyncTask создавал курсор для PagerAdapter, я не устанавливал адаптер, пока он не закончил. Существует известная проблема с ViewPager и активностью onPause, когда адаптер не был установлен (см. здесь ).

Чтобы преодолеть это, я изменил свой адаптер, чтобы он возвращал 0, когда для адаптера нет курсора:

public int getCount() {
    // return the size of the cursor if it has been instantiated; 
    return (mCursor !=null) ? mCursor.getCount() : 0 ; 
}

и добавил метод setCurrentCursor к адаптеру. Таким образом, я смог настроить адаптер и связать его с viewpager в onCreate, а затем добавить курсор на адаптер, когда он стал доступен из ASyncTask;

    public void setCurrentCursor(Cursor cu){
    this.mCursor = cu; 
    this.notifyDataSetChanged();
}

Теперь все, что мне нужно сделать, - это вызвать adapter.setCurrentCursor в методе onPostExecute объекта ASyncTask, передающего созданный курсор.

Надеюсь, это поможет.

Спасибо, м

0 голосов
/ 27 сентября 2011

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

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