如何通过 Handler 更新 Map?

How to update Map via Handler?

我正在使用 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;

    }
}

如有任何帮助,我们将不胜感激。

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

在线程中执行 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; //
  }

}

注意线程的运行()或者asyncTask的doInBackground不是UI线程,也就是说在这些方法里面改变ui会导致崩溃。但是,handlerMessage() 或 onPostExecute() 方法在主线程内执行,您可以使用它来更新视图。