将AsyncTask与数据库一起使用

时间:2011-05-07 22:01:12

标签: android database multithreading android-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()中尝试显示数据,但我什么都没得到,我确信我在数据库中有一些东西。< / p>

2 个答案:

答案 0 :(得分:1)

首先,您还没有正确声明AsyncTask类,从android文档here中的示例可以看出,您需要指定它将使用的三种类型:

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

这将解决您的doInBackround问题。无法识别的原因是结果需要替换您的列表。

要将数据恢复到UI线程,您需要设置一个将被调用的侦听器onProgressUpdate(),并使用publishProgress()传递从AsyncTask发送的Progress对象。

答案 1 :(得分:1)

由于我没有看到您的AsyncTask Params,Progress,Result的声明,这很难调试,但我可以看到两个问题 1)你的doInBackground与原型doInBackground(Params ...)不匹配 2)当线程doInBackground在onPostExecute中返回时,我看不到实际对geoPointsArray做任何事情的代码。要回答你的问题,请在onPostExecute中返回GUI线程。

我有一些代码here,可能会有所帮助,也可能没有帮助。

编辑:考虑将db作为参数传递

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())