Java OSMBonuspack道路管理器网络维护线程异常
以下是OSMBonuspack的教程: 运行应用程序时,MainActivity.java中的第47行出现NetworkOnMainThreadException,即Java OSMBonuspack道路管理器网络维护线程异常,java,android,android-asynctask,osmdroid,Java,Android,Android Asynctask,Osmdroid,以下是OSMBonuspack的教程: 运行应用程序时,MainActivity.java中的第47行出现NetworkOnMainThreadException,即 Road road = roadManager.getRoad(waypoints); 如何为这个块编写asyncTask MainActivity.java: package com.osmbonuspack_tutorial; import android.app.Activity; import android.os.B
Road road = roadManager.getRoad(waypoints);
如何为这个块编写asyncTask
MainActivity.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);
}
}
package com.osmbonuspack\u教程;
导入android.app.Activity;
导入android.os.Bundle;
导入org.osmdroid.api.IMapController;
导入org.osmdroid.bonuspack.routing.OSRMRoadManager;
导入org.osmdroid.bonuspack.routing.Road;
导入org.osmdroid.bonuspack.routing.RoadManager;
导入org.osmdroid.tileprovider.tilesource.TileSourceFactory;
导入org.osmdroid.util.GeoPoint;
导入org.osmdroid.views.MapView;
导入org.osmdroid.views.overlay.Marker;
导入org.osmdroid.views.overlay.Polyline;
导入java.util.ArrayList;
公共类MainActivity扩展了活动{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MapView地图=(MapView)findViewById(R.id.map);
map.setTileSource(TileSourceFactory.MAPNIK);
map.setBuiltInZoomControls(真);
map.setMultiTouchControls(真);
地质点起始点=新的地质点(48.13,-1.63);
IMapController mapController=map.getController();
mapController.setZoom(9);
mapController.setCenter(startPoint);
Marker startMarker=新标记(地图);
startMarker.setPosition(起始点);
startMarker.setAnchor(Marker.ANCHOR\u中心,Marker.ANCHOR\u底部);
map.getOverlays().add(startMarker);
RoadManager RoadManager=新的OSRMRoadManager(本);
ArrayList航路点=新的ArrayList();
航路点。添加(起始点);
地质点端点=新的地质点(48.4,-1.9);
航路点。添加(终点);
Road Road=roadManager.getRoad(航路点);
多段线道路覆盖=RoadManager.buildRoadOverlay(道路,此);
map.getOverlays().add(道路覆盖);
}
}
您好在快速搜索教程后,我想出了以下解决方案
在Mkergell教程中,他明确表示您必须在后台完成。您可以在OSMNavigator中参考
在查看了几个小时的代码后,我提出了这个解决方案,希望这能对您有所帮助
ArrayList<OverlayItem> overlayItemArray;
overlayItemArray = new ArrayList<>();
GeoPoint startPoint = new GeoPoint(27.6803, 85.3303);
GeoPoint destinationPoint = new GeoPoint(27.6303, 85.3203);
接下来让我们生成方法并从该方法调用异步
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);
}
public void getRoadAsync(){
mRoads=null;
GeoPoint roadStartPoint=null;
如果(起始点!=null){
道路起点=起点;
}else if(myLocationOverlay.isEnabled()&&myLocationOverlay.getLocation()!=null){
//使用我的当前位置作为行程起点:
roadStartPoint=myLocationOverlay.getLocation();
}
ArrayList航路点=新的ArrayList(2);
航路点。添加(道路起点);
//添加中间过孔点:
//对于(地质点p:过孔点){
//加上(p);
// }
航路点。添加(目的地点);
新建UpdateRoadTask().execute(航路点);
}
下一步,让我们创建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.
}
}
}
私有类UpdateRoadTask扩展了AsyncTask{
受保护道路[]背景(对象…参数){
@抑制警告(“未选中”)
ArrayList航路点=(ArrayList)参数[0];
RoadManager RoadManager=新的OSRMRoadManager(getActivity());
返回roadManager.getRoads(航路点);
}
@凌驾
后期执行时受保护的void(道路[]道路){
mRoads=道路;
如果(道路==null)
返回;
如果(道路[0].mStatus==道路状态\技术问题)
Toast.makeText(map.getContext(),“获取路线时的技术问题”,Toast.LENGTH_SHORT.show();
else if(道路[0].mStatus>Road.STATUS\u技术问题)//功能问题
Toast.makeText(map.getContext(),“此处没有可能的路由”,Toast.LENGTH_SHORT.show();
受保护的多段线[]mRoadOverlays=新的多段线[roads.length];
List mapOverlays=map.getOverlays();
对于(int i=0;i
总之,更多信息请参考OSMNavigator并遵循教程。您应该避免在UI线程上执行长时间运行的操作。这包括文件和网络访问
StrictMode
允许在应用程序中设置策略,以避免执行不正确的操作。例如,如果以下设置违反了某些Android策略,则会导致应用程序崩溃。StrictMode只应在开发过程中使用,而不应在实时应用程序中使用
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
将其放在OnCreate方法中。请参阅感谢您编辑此方法Tutorial@ThilinaEkanayaka请回答您是如何更正此问题的。
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);