Android 异步任务的问题

Android 异步任务的问题,android,database,android-asynctask,Android,Database,Android Asynctask,我有以下代码,其中我从数据库(经度、纬度)读取一些数据,并尝试在UI线程中的这些点之间画一条线: 绘制这条线的功能包括: public void theRouteDraw(List<GeoPoint> geoPointsArray) { for (int i = 0; i < geoPointsArray.size(); i++) { p = geoPointsArray.get(i); mc.animateTo(p);

我有以下代码,其中我从数据库(经度、纬度)读取一些数据,并尝试在UI线程中的这些点之间画一条线:

绘制这条线的功能包括:

public void theRouteDraw(List<GeoPoint> geoPointsArray)
{
    for (int i = 0; i < geoPointsArray.size(); i++)
    {
        p = geoPointsArray.get(i);
        mc.animateTo(p);
        mc.setZoom(13);
        mapView.invalidate();
        mapView.setSatellite(true);
    }
}
除了这两种方法之外,下面是我的代码的外观:

public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.screen_database);

    db = new DBAdapter(this);
    progress = new ProgressDialog(this);
    progress.setIndeterminate(true);
    progress.setMessage("I am thinking");
    InitTask init_task = new InitTask();
    init_task.execute(db);
    initMap();
}

private void initMap()
{
    mapView = (MapView) findViewById(R.id.mapview);
    mapView.setBuiltInZoomControls(true);
    mapView.setStreetView(true);
    mc = mapView.getController();
}
我的异步类

public class InitTask extends AsyncTask<DBAdapter, GeoPoint, List<GeoPoint>>
{
    List<GeoPoint> geoPointsArray = new ArrayList<GeoPoint>();
    DBAdapter db;
    int latitude;
    int longitude;
    GeoPoint p;

    protected void onPreExecute()
    {
        progress.show();
    }

    protected List<GeoPoint> doInBackground(DBAdapter... db)
    {
        try
        {
            db[0].openDataBase();
            Cursor c = db[0].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[0].close();
        }
        catch (Exception e)
        {
            Log.d("Eroare", "doInBackground", e);
        }

        return geoPointsArray;
    }

    protected void onPostExecute(List<GeoPoint> geoPointsArray)
    {
        // super.onPostExecute(geoPointsArray);
        progress.dismiss();

        Log.d("Lista", new Boolean(geoPointsArray.isEmpty()).toString());
        theRouteDraw(geoPointsArray);
        initMyLocation();
    }
}
现在,我展示并一步一步地得到它们(这是我想要的),如果我能弄清楚为什么我不能展示路线,我会是一个快乐的人。我已经很长时间不快乐了。Thx:D


更新2:

类myLocOverlay扩展了覆盖{

    public myLocOverlay(){

    }   

    public void draw(Canvas canvas, MapView mapv, boolean shadow){

    super.draw(canvas, mapv, shadow);

    Projection projection = mapView.getProjection();
    Path p1 = new Path();
   for (int i = 0; i < geoPointsArray.size(); i++) {
   if (i == geoPointsArray.size() - 1) {
       break;
   }
    Point from = new Point();
    Point to = new Point();
   projection.toPixels(geoPointsArray.get(i), from);
   projection.toPixels(geoPointsArray.get(i + 1), to);

    p1.moveTo(from.x, from.y);
    p1.lineTo(to.x, to.y);

    }

    Paint mPaint = new Paint();
    mPaint.setStyle(Style.STROKE);
    mPaint.setColor(Color.GREEN);
    mPaint.setAntiAlias(true);
    mPaint.setStrokeWidth(4);
    canvas.drawPath(p1, mPaint);
    super.draw(canvas, mapView, shadow);

} 


}
public myLocOverlay(){
}   
公共空白绘制(画布、MapView mapv、布尔阴影){
super.draw(画布、贴图、阴影);
Projection=mapView.getProjection();
路径p1=新路径();
对于(int i=0;i

在initMyLocation()方法中,我向当前位置添加了一个覆盖…该覆盖从myLocOverlay()类中获得

myLocOverlay()穿过geoArrayPoints并在它们之间画一条线


RouteDraw()方法将我得到的新地质点放在地图上……而且效果很好

您是否知道,
doInBackground
方法在后台线程上执行,而
onPre-
onPostExecute
方法在UI线程上运行?您可以使用
doInBackground
从数据库中检索数据,使用
onPostExecute
方法根据检索到的点在地图上画线。我知道……这正是我正在做的:)抱歉,乍一看,由于格式问题,我没有找到您的
onPostExecute
方法,这就是为什么我认为所有的代码都在
doInBackground
中。当我在onCreate()中直接使用它们时,绘制图形的两个函数起作用,并且数据是在UI线程中读取的…现在我什么也看不到…thx调试时,在
doInBackground
中,
onPostExecute
和分别在
theRouteDraw
方法中,您是否正确地获得了
GeoPoint
实例列表?
protected List<GeoPoint> doInBackground(DBAdapter... db)
{
    try
    {
        db[0].openDataBase();
        Cursor c = db[0].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);
                publishProgress(p);
                SystemClock.sleep(1000);
            }
            while (c.moveToNext());
        }
        c.close();
        db[0].close();
    }
    catch (Exception e)
    {
        Log.d("Eroare", "doInBackground", e);
    }
    return geoPointsArray;
}
protected void onProgressUpdate(GeoPoint... progress)
{
                 theRouteDraw(progress1[0]);



         int lon=progress1[0].getLongitudeE6();

          int lat=progress1[0].getLatitudeE6();

          GeoPoint p2=new GeoPoint(lon,lat);

        geoPointsArray.add(p2);

         initMyLocation();
}
    public myLocOverlay(){

    }   

    public void draw(Canvas canvas, MapView mapv, boolean shadow){

    super.draw(canvas, mapv, shadow);

    Projection projection = mapView.getProjection();
    Path p1 = new Path();
   for (int i = 0; i < geoPointsArray.size(); i++) {
   if (i == geoPointsArray.size() - 1) {
       break;
   }
    Point from = new Point();
    Point to = new Point();
   projection.toPixels(geoPointsArray.get(i), from);
   projection.toPixels(geoPointsArray.get(i + 1), to);

    p1.moveTo(from.x, from.y);
    p1.lineTo(to.x, to.y);

    }

    Paint mPaint = new Paint();
    mPaint.setStyle(Style.STROKE);
    mPaint.setColor(Color.GREEN);
    mPaint.setAntiAlias(true);
    mPaint.setStrokeWidth(4);
    canvas.drawPath(p1, mPaint);
    super.draw(canvas, mapView, shadow);

} 


}