Использование AsyncTask с базой данных - PullRequest
1 голос
/ 08 мая 2011

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

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() я пытаюсь отобразить данные, но ничего не получаю, и я уверен, что у меня что-то есть в БД.

Ответы [ 2 ]

1 голос
/ 08 мая 2011

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

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

РЕДАКТИРОВАТЬ: Рассмотрим передачу дБ в качестве параметра

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

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

1 голос
/ 08 мая 2011

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

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

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

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

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