我有以下代码:
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>
答案 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())