我正在学习OSMBonuspack的这个教程:https://github.com/MKergall/osmbonuspack/wiki/Tutorial_1
当我运行这个应用程序时,我得到了MainActivity.java中47行的NetworkOnMainThreadException,
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);
}
}发布于 2016-08-06 19:57:49
你好,在快速搜索了一下教程后,我想出了以下解决方案。
在Mkergell的教程中,他清楚地说过,你必须在background.You中做,可以在OSMNavigator中参考。
在看了几个小时的代码后,我想出了这个解决方案,希望这能对你有所帮助。
ArrayList<OverlayItem> overlayItemArray;
overlayItemArray = new ArrayList<>();
GeoPoint startPoint = new GeoPoint(27.6803, 85.3303);
GeoPoint destinationPoint = new GeoPoint(27.6303, 85.3203); 现在,在overlayitem数组中添加geopoint
overlayItemArray.add(new OverlayItem("Starting Point", "This is the starting point", startPoint));
overlayItemArray.add(new OverlayItem("Destination", "This is the detination point", destinationPoint));
getRoadAsync();接下来,让我们创建方法并从该方法调用async。
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并按照教程进行操作。
发布于 2017-01-19 06:49:55
应避免在UI线程上执行长时间运行的操作。这包括文件和网络访问。
StrictMode允许在应用程序中设置策略,以避免做不正确的事情。例如,如果您的应用程序违反了某些Android策略,下面的设置将使其崩溃。StrictMode应该只在开发过程中使用,而不是在活动应用程序中使用。
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);将此代码放入OnCreate方法中。
https://stackoverflow.com/questions/38539637
复制相似问题