2017-07-26 39 views
0

我正在用Asynctask更新地图。现在我想用Handler做同样的事情。我环顾四周,但无法理解我应该做什么。 AsyncTask有点慢,我希望它有点快。如何通过处理程序更新地图?

下面是我在做什么在的AsyncTask:

class DrawRouteTask extends AsyncTask<GeoPoint, Void, Polyline> { 

    private Exception exception; 
    private Polyline roadOverLay; 

    @Override 
    protected void onPostExecute(Polyline polyline) { 
     super.onPostExecute(polyline); 
     Log.i("AsyncTAsk ", " in post execute " + roadOverLay); 
     roadOverlay = roadOverLay; 


     // mOsmv.invalidate(); 

     mOsmv.getOverlays().add(roadOverLay); 
     mOsmv.invalidate(); 
    } 

    @Override 
    protected Polyline doInBackground(GeoPoint... geoPoints) { 
     try { 
      Log.i("AsyncTask", "Start Point >> " + geoPoints[0]); 
      Log.i("AsyncTask", "End Point >> " + geoPoints[1]); 

      RoadManager roadManager = new OSRMRoadManager(getContext()); 

      ArrayList<GeoPoint> waypoints = new ArrayList<>(); 
      waypoints.add(geoPoints[0]); 
      waypoints.add(geoPoints[1]); 


      Marker marker = new Marker(mOsmv); 
      marker.setPosition(geoPoints[0]); 
      marker.setPosition(geoPoints[1]); 

      marker.setTitle("Your Location "); 
      Log.i("AsyncTask ", "Drawable >> "+ ContextCompat.getDrawable(getContext(), R.drawable.pin)); 
      marker.setIcon(ContextCompat.getDrawable(getContext(), R.drawable.pin)); 


      mOsmv.getOverlays().add(marker); 

      road = roadManager.getRoad(waypoints); 

      roadOverLay = RoadManager.buildRoadOverlay(road); 
      roadOverLay.setColor(Color.RED); 


      return roadOverLay; 


     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     return null; 

    } 
} 

任何帮助,将不胜感激。

回答

0

你的意思是由一个线程和处理程序?

做任何在你的doInBackground()函数内的线程,并通过处理程序发送到主线程。

你的代码应该看起来大致像这样。

new Thread(new Runnable(){ 
      public void run(){ 
       // your doInBackground() codes.. 
       Message msg = handler.obtainMessage(what);//what refers to a field what inside Message; 
       msg.obj = anything you want to put; 
       msg.sendToTarget(); //dispatches msg to the certain handler. 
      } 

    }).start(); 

private Handler handler = new Handler(){ 
    public void handleMessage(Message msg){ 
    //handles message dispatched from the above code. 
    int what = msg.what; //You can use the 'what' as a switch-case case. 
    SomeObject data = (SomeObject) msg.obj; // 
    } 

} 

注意,线程的run()或的AsyncTask的doInBackground不是UI线程,这意味着,改变这些方法中的UI会造成死机。但是,handlerMessage()或onPostExecute()方法在主线程内执行,您可以使用它来更新视图。

+0

消息究竟代表什么? – KingintheNorth

+0

消息就像是用于在活动之间传递数据的intent中的一个包。它可以从线程获取数据(int what,Object obj),并将其发送给处理程序,该处理程序将在主线程中运行。 – March3April4

+0

在你的情况下,roadOverLay应该是msg.obj。然后处理程序可以使用它来更新地图。 – March3April4

相关问题