2017-07-26 5 views
0

マップをAsynctaskで更新していました。今私はハンドラーで同じことをしたい。私は周りを見回しましたが、正確に何をすべきか理解できませんでした。 AsyncTaskはちょっと遅く、少し速くしたいです。ここでHandler経由でマップを更新するには?

は私が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

メッセージは、アクティビティ間でデータを渡すために使用するインテント内のバンドルのようなものです。スレッドからデータ(int、Object obj)を取得してハンドラに送信すると、メインスレッド上で動作します。 – March3April4

+0

あなたの場合、roadOverLayはmsg.objでなければなりません。その後、ハンドラはマップを更新するためにそれを使用できます。 – March3April4

関連する問題