2016-11-11 64 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 
     } 
    } 
}