簡體   English   中英

如何正確創建AsyncTask

[英]How to create an AsyncTask properly

我是Java的新手,因為這個問題屬於我工作的一個非常敏感的項目,所以我沒有時間學習AsyncTasks的所有內容。 所以我的問題是:

如何從以下代碼構造AsyncTask

目標是在地圖上繪制路線。 我用兩個Geopoints (起始位置和路線的目的地)填充ArrayList roadManager應該將這些航點發送給服務器,該服務器將回送路線。

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 -method,對吧?:

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

來自上層代碼的變量location源自不同的方法,我打算從該方法啟動異步任務。 意思是,我需要在調用它時將變量傳遞給AsyncTask,我也不確定如何完成。

這是變量location的初始化:

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

將耗時的任務放在onPostExecute()中的doInBackground(),udpate視圖中。

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
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM