- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在关注 OSMBonuspack 教程:https://github.com/MKergall/osmbonuspack/wiki/Tutorial_1
当我运行应用程序时,我在 MainActivity.java 中的第 47 行收到 NetworkOnMainThreadException,即,
Road road = roadManager.getRoad(waypoints);
如何为这个确切的 block 编写 asyncTask?
主要 Activity .java :
package com.osmbonuspack_tutorial;
import android.app.Activity;
import android.os.Bundle;
import org.osmdroid.api.IMapController;
import org.osmdroid.bonuspack.routing.OSRMRoadManager;
import org.osmdroid.bonuspack.routing.Road;
import org.osmdroid.bonuspack.routing.RoadManager;
import org.osmdroid.tileprovider.tilesource.TileSourceFactory;
import org.osmdroid.util.GeoPoint;
import org.osmdroid.views.MapView;
import org.osmdroid.views.overlay.Marker;
import org.osmdroid.views.overlay.Polyline;
import java.util.ArrayList;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MapView map = (MapView) findViewById(R.id.map);
map.setTileSource(TileSourceFactory.MAPNIK);
map.setBuiltInZoomControls(true);
map.setMultiTouchControls(true);
GeoPoint startPoint = new GeoPoint(48.13, -1.63);
IMapController mapController = map.getController();
mapController.setZoom(9);
mapController.setCenter(startPoint);
Marker startMarker = new Marker(map);
startMarker.setPosition(startPoint);
startMarker.setAnchor(Marker.ANCHOR_CENTER, Marker.ANCHOR_BOTTOM);
map.getOverlays().add(startMarker);
RoadManager roadManager = new OSRMRoadManager(this);
ArrayList<GeoPoint> waypoints = new ArrayList<GeoPoint>();
waypoints.add(startPoint);
GeoPoint endPoint = new GeoPoint(48.4, -1.9);
waypoints.add(endPoint);
Road road = roadManager.getRoad(waypoints);
Polyline roadOverlay = RoadManager.buildRoadOverlay(road, this);
map.getOverlays().add(roadOverlay);
}
}
最佳答案
您好,在快速搜索教程后,我想到了以下解决方案。
在Mkergell的教程里他说的很清楚,你必须在后台做,你可以在OSMNavigator中引用。
在查看代码几个小时后,我想出了这个解决方案,希望这对您有所帮助。
ArrayList<OverlayItem> overlayItemArray;
overlayItemArray = new ArrayList<>();
GeoPoint startPoint = new GeoPoint(27.6803, 85.3303);
GeoPoint destinationPoint = new GeoPoint(27.6303, 85.3203);
现在在 overlayitem 数组中添加地理点
overlayItemArray.add(new OverlayItem("Starting Point", "This is the starting point", startPoint));
overlayItemArray.add(new OverlayItem("Destination", "This is the detination point", destinationPoint));
getRoadAsync();
接下来让 make 方法并从该方法调用异步。
public void getRoadAsync() {
mRoads = null;
GeoPoint roadStartPoint = null;
if (startPoint != null) {
roadStartPoint = startPoint;
} else if (myLocationOverlay.isEnabled() && myLocationOverlay.getLocation() != null) {
//use my current location as itinerary start point:
roadStartPoint = myLocationOverlay.getLocation();
}
ArrayList<GeoPoint> waypoints = new ArrayList<GeoPoint>(2);
waypoints.add(roadStartPoint);
//add intermediate via points:
// for (GeoPoint p:viaPoints){
// waypoints.add(p);
// }
waypoints.add(destinationPoint);
new UpdateRoadTask().execute(waypoints);
}
下一步,让我们创建 roadmanager 异步类
private class UpdateRoadTask extends AsyncTask<Object, Void, Road[]> {
protected Road[] doInBackground(Object... params) {
@SuppressWarnings("unchecked")
ArrayList<GeoPoint> waypoints = (ArrayList<GeoPoint>) params[0];
RoadManager roadManager = new OSRMRoadManager(getActivity());
return roadManager.getRoads(waypoints);
}
@Override
protected void onPostExecute(Road[] roads) {
mRoads = roads;
if (roads == null)
return;
if (roads[0].mStatus == Road.STATUS_TECHNICAL_ISSUE)
Toast.makeText(map.getContext(), "Technical issue when getting the route", Toast.LENGTH_SHORT).show();
else if (roads[0].mStatus > Road.STATUS_TECHNICAL_ISSUE) //functional issues
Toast.makeText(map.getContext(), "No possible route here", Toast.LENGTH_SHORT).show();
protected Polyline[] mRoadOverlays = new Polyline[roads.length];
List<Overlay> mapOverlays = map.getOverlays();
for (int i = 0; i < roads.length; i++) {
Polyline roadPolyline = RoadManager.buildRoadOverlay(roads[i], getActivity());
mRoadOverlays[i] = roadPolyline;
String routeDesc = roads[i].getLengthDurationText(getActivity(), -1);
roadPolyline.setTitle(getString(R.string.app_name) + " - " + routeDesc);
roadPolyline.setInfoWindow(new BasicInfoWindow(org.osmdroid.bonuspack.R.layout.bonuspack_bubble, map));
roadPolyline.setRelatedObject(i);
// roadPolyline.setOnClickListener(new RoadOnClickListener());
mapOverlays.add(1, roadPolyline);
//selectRoad(0);
// map.invalidate();
//we insert the road overlays at the "bottom", just above the MapEventsOverlay,
//to avoid covering the other overlays.
}
}
}
就这些,更多内容请引用 OSMNavigator 并按照教程进行操作。
关于java - OSMBonuspack RoadManager NetworkOnMainThreadException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38539637/
我在这里学习教程 https://code.google.com/p/osmbonuspack/wiki/Tutorial_1但我遇到了一个错误,它没有正确显示正确的路线。它只是显示从 A 点到 B
我正在关注 OSMBonuspack 教程:https://github.com/MKergall/osmbonuspack/wiki/Tutorial_1 当我运行应用程序时,我在 MainActi
我是一名优秀的程序员,十分优秀!