如何正确创建 AsyncTask

How to create an AsyncTask properly

我是 Java 的新手,由于这个问题对我的工作来说属于一个非常时间敏感的项目,所以我没有时间学习有关 AsyncTasks 的所有内容。 所以我的问题是:

如何使用以下代码构造 AsyncTask

目标是在地图上画出路线。我用两个 Geopoints(路线的起始位置和目的地)填充 ArrayListroadManager 应该将那些 waypoints 发送到服务器,服务器将路由发回给我。

buildRoadOverlay是最后在地图上绘制路线的方法

    RoadManager roadManager = new OSRMRoadManager(this);

    ArrayList<GeoPoint> waypoints = new ArrayList<GeoPoint>();
    GeoPoint myLocation = new GeoPoint(51.488978, 6.746994);
    waypoints.add(Location);
    waypoints.add(myLocation);
    Road road = roadManager.getRoad(waypoints);

我想这必须在 onPostExecute 方法中进行,对吗?:

    Polyline roadOverlay = RoadManager.buildRoadOverlay(road);
    map.getOverlays().add(roadOverlay);

上面代码中的变量location来自不同的方法,我打算从中启动Async任务。意思是,我需要在调用它时将变量传输到 AsyncTask,我也不确定该怎么做。

这是变量的初始化location:

GeoPoint Location = new GeoPoint(Double.parseDouble(place.getLongitude()), 
    Double.parseDouble(place.getLatitude()));

把耗时任务放到doInBackground(),更新视图放到onPostExecute()。

public void drawRouteAsync() {
    GeoPoint location = new GeoPoint(Double.parseDouble(place.getLongitude()),
            Double.parseDouble(place.getLatitude()));
    GeoPoint myLocation = new GeoPoint(51.488978, 6.746994);

    new RouteAsyncTask().execute(location, myLocation);
}

private class RouteAsyncTask extends AsyncTask<GeoPoint, Void, Road> {
    @Override
    protected Road doInBackground(GeoPoint... params) {
        ArrayList<GeoPoint> waypoints = new ArrayList<GeoPoint>();
        waypoints.add(params[0]); // location
        waypoints.add(params[1]); // myLocation
        RoadManager roadManager = new OSRMRoadManager(mContext); // your context
        Road road = roadManager.getRoad(waypoints); // time consuming
        return road;
    }

    @Override
    protected void onPostExecute(Road road) {
        Polyline roadOverlay = RoadManager.buildRoadOverlay(road);
        map.getOverlays().add(roadOverlay); // update view
    }
}

AsyncTask 有 3 个重要的方法:

  1. protected void onPreExecute() //主线程
  2. protected E doInBackground(T... params) //异步线程
  3. protected void onPostExecute(E result) //主线程

ET将在实现中定义。


知道这一点后,您的 AsincTask 应该看起来像这样:

public class GetRouteTask extends AsyncTask<GeoPoint, Void, Integer> {

    private Context mContext;
    private OnGetRouteCompleted delegate;
    private Road route;

    public GetRouteTask (Context context, OnGetRouteCompleted delegate) {
        this.delegate = delegate;
        this.mContext = context;
    }

    @Override
    protected Integer doInBackground(GeoPoint... params) {
        ArrayList<GeoPoint> wayPoints = new ArrayList<GeoPoint>();
        wayPoints.add(params[0]); // pointFrom 
        wayPoints.add(params[1]); // pointTo 

        try {
            RoadManager roadManager = new OSRMRoadManager(mContext);
            route = roadManager.getRoad(waypoints);
            return 1;
        } catch (JSONException e) {
            return -1;
        }
    }

    @Override
    protected void onPostExecute(Integer success) {
        if (success == 1) {
            delegate.onGetRouteCompleted(true, route);
        } else {
            delegate.onGetRouteCompleted(false, null);
        }
        Polyline roadOverlay = RoadManager.buildRoadOverlay(road);
        map.getOverlays().add(roadOverlay); // update view
    }

    public interface OnGetRouteCompleted {
        public void onGetRouteCompleted(boolean success, Route route);
    }
}

这就是你的使用方式:

public class SomeActivity extend Activity implements OnGetRouteCompleted {

    // Methods and properties...

    public void drawRouteAsync() {
        GeoPoint pointFrom = new GeoPoint(51.489878, 6.143294);
        GeoPoint pointTo = new GeoPoint(51.488978, 6.746994);

        new GetRouteTask(getApplicationContext(), this).execute(new GeoPoint(){pointFrom , pointTo});
    }

    @Override
    public void onGetRouteCompleted(boolean success, Route route) {
        if (success) {
            Polyline roadOverlay = RoadManager.buildRoadOverlay(route);
            map.getOverlays().add(roadOverlay); // update view
        }
    }
}