Использование AsyncTask с базой данных

У меня есть следующий код:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.screen_database); 
    db=new DBAdapter(this);         
    InitTask init_task=new InitTask();
    init_task.execute(db);
}

public class InitTask extends AsyncTask <DBAdapter, Void, List<GeoPoint>> {
    List<GeoPoint> geoPointsArray = new ArrayList<GeoPoint>();
    DBAdapter db;
    int latitude;
    int longitude;
    GeoPoint p;
    protected List<GeoPoint> doInBackground(DBAdapter...adapters) {
        try{
            db.openDataBase();
            Cursor c=db.getAllData();
            if (c.moveToFirst()) { 
                do{
                longitude=Integer.parseInt(c.getString(0));
                    latitude=Integer.parseInt(c.getString(1));
                    p = new GeoPoint(latitude,longitude);
                    geoPointsArray.add(p);
                } while(c.moveToNext());
            }
            c.close();
            db.close();
        } catch(Exception e) {
            Log.d("Eroare","doInBackground",e);
        }
        return geoPointsArray;
    }

    protected void onPostExecute(List<GeoPoint> geoPointsArray {
        super.onPostExecute(geoPointsArray);
        for (int i=0;i<geoPointsArray.size();i++) {
            Log.d("Lista",geoPointsArray.get(i).toString());
        }
    }
}

В doInBackground я пытаюсь читать из базы данных, а в своем onPostExecute() пытаюсь отобразить данные, но ничего не получаю, и я уверен, что у меня что-то есть в БД.


person adrian    schedule 07.05.2011    source источник
comment
из вашего обновленного кода измените db.openDataBase() на adapters[0].openDataBase(), затем удалите super.onPostExecute, затем исправьте фигурные скобки или используйте логический код, который я опубликовал, проверив, является ли geoPointsArray нулевым, а если не нулевым, вызывая isEmpty( ), чтобы увидеть, если он пуст   -  person JAL    schedule 08.05.2011
comment
Это работает... в onPostExecute у меня есть все данные.... с super.onPostExecute() я передаю это в поток пользовательского интерфейса??? Спасибо, ууу   -  person adrian    schedule 08.05.2011
comment
Хитрость заключается в том, чтобы объявить класс InitTask внутри класса активности пользовательского интерфейса. Затем вы можете коснуться переменных пользовательского интерфейса действия внутри метода onPostExecute! Чтобы понять, как это работает, просмотрите вложенные классы или внутренние классы ИЛИ ПРОСТО ПОПРОБУЙТЕ. Получайте удовольствие.   -  person JAL    schedule 08.05.2011


Ответы (2)


Поскольку я не вижу вашего объявления для AsyncTask Params, Progress, Result, это сложно отладить, но я вижу две проблемы: 1) ваш doInBackground не соответствует прототипу doInBackground (Params...) 2) я не вижу кода, который на самом деле делает что-нибудь с geoPointsArray, когда многопоточный doInBackground возвращается в onPostExecute. Чтобы ответить на ваш вопрос, в onPostExecute вы вернулись в поток графического интерфейса.

У меня есть код здесь, который может помочь, а может и не помочь.

РЕДАКТИРОВАТЬ: рассмотрите возможность передачи db в качестве параметра

new AsynchTask<DataBase?,Void,List<GeoPoint>>

Затем закомментируйте весь код, не относящийся к базе данных. Оберните код базы данных в try catch Exception e. Запишите Log.d(TAG,"doInBackground",e) при исключении. Затем в onPostExecute проверьте список, чтобы увидеть, что возвращает поток в doInBackground, возможно, вызвав Log.d(TAG,new Boolean(myList.isEmpty()).toString())

person JAL    schedule 07.05.2011
comment
У меня были свои параметры, но я не знаю, почему он их не отображал... во всяком случае, я все еще приближаюсь к силе..... - person adrian; 08.05.2011
comment
И если вы здесь, есть еще одна вещь - знаете ли вы, как я могу отобразить данные, которые у меня есть в geoPointsArray... шаг за шагом????Я имею в виду, как только doInBackground будет завершен в geoPointsArray, у меня будут все данные, которые Я передам его в RouteDraw, который нарисует линию между ними. Я хочу что-то вроде рендеринга точки - нарисуйте линию, визуализируйте другую точку и нарисуйте линию и так далее... Любая подсказка о том, как я мог бы это сделать это?Спасибо - person adrian; 08.05.2011
comment
@adrian ... Как только вы решите проблему с получением данных. Я бы просто задал отдельный вопрос. Я определенно НЕ из тех, кто задает вопросы по графике! - person JAL; 08.05.2011
comment
Ты единственный, кто отвечает:)))......и вопрос о том, как получить данные шаг за шагом;)...спасибо - person adrian; 08.05.2011

Во-первых, вы неправильно объявили свой класс AsyncTask, как видно из примера в документации по Android здесь вам нужно указать три типа, которые он будет использовать:

public class InitTask extends AsyncTask<Params, Progress, Result>

Это решит вашу проблему с doInBackround. Причина, по которой он не распознается, заключается в том, что Result необходимо заменить вашим списком.

Чтобы вернуть данные в поток пользовательского интерфейса, вам нужно настроить прослушиватель onProgressUpdate(), который будет вызываться, передавая объект Progress, который вы отправляете из AsyncTask с помощью publishProgress().

person CL22    schedule 07.05.2011