gpt4 book ai didi

java - OSMBonuspack RoadManager NetworkOnMainThreadException

转载 作者:搜寻专家 更新时间:2023-11-01 08:33:39 24 4
gpt4 key购买 nike

我正在关注 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com