如何通过 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() 方法在主线程内执行,您可以使用它来更新视图。
我正在使用 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() 方法在主线程内执行,您可以使用它来更新视图。