2016-11-11 62 views
1

我是Java新手,因爲這個問題屬於我的工作非常時間敏感的項目,我沒有時間學習有關AsyncTasks的一切。 所以我的問題是:如何正確創建一個AsyncTask

我該如何從以下代碼構造一個AsyncTask

目標是在地圖上繪製路線。我填寫了ArrayList兩個Geopoints(開始位置和路線的目的地)。 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())); 
+1

的AsyncTask由onPreExecute(),doInBackground()的, onProgressUpdate和onPostExecute()。你會在這裏顯示進度條。您將在doInBackground(params ...)中設置/打開您的連接,您將在其中執行需要很長時間的後臺任務。您可以在此處調用publishProgress(),它將在onProgressUpdate()步驟中發佈,必須在這裏返回一個值。在onProgressUpdate()階段,您將顯示更新。在最後一個階段,在ui線程上調用onPostExecute(您的結果),完成後您將從後臺任務中獲得結果。 – HaroldSer

+0

我正在使用osmdroid(OpenStreetMaps) – Glave

+0

這是無關緊要的,你可以使用任何AsyncTask,下載,應用圖像過濾器... – IgniteCoders

回答

2

放入doInBackground(該耗時的任務,UDPATE視圖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 
    } 
} 
+0

現在不能測試它,因爲Android Studio告訴我「OSRMRoadManager中的OSRMRoadManager(android.content.Context)不能應用於bla.bla.bla.RouteAsyncTask」並強調「this」 – Glave

+0

是的,你需要傳遞一些對象作爲上下文工作。我的意思是活動或應用上下文。在這個答案中,這個意思是asyncTask,它不是一個上下文。 – IgniteCoders

+0

@MansApps你知道該怎麼做嗎?我甚至不知道上下文是什麼。我應該在這個括號裏寫什麼才能起作用? – Glave

1

的AsyncTask有3種重要的方法:

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

將在執行中定義和T


因此,瞭解這一點,您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 
     } 
    } 
}