首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OSMBonuspack RoadManager NetworkOnMainThreadException

OSMBonuspack RoadManager NetworkOnMainThreadException
EN

Stack Overflow用户
提问于 2016-07-23 16:11:07
回答 2查看 1.2K关注 0票数 3

我正在学习OSMBonuspack的这个教程:https://github.com/MKergall/osmbonuspack/wiki/Tutorial_1

当我运行这个应用程序时,我得到了MainActivity.java中47行的NetworkOnMainThreadException,

代码语言:javascript
复制
Road road = roadManager.getRoad(waypoints);

如何为这个代码块编写asyncTask?

MainActivity.java:

代码语言:javascript
复制
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);
    }
}
EN

回答 2

Stack Overflow用户

发布于 2016-08-06 19:57:49

你好,在快速搜索了一下教程后,我想出了以下解决方案。

在Mkergell的教程中,他清楚地说过,你必须在background.You中做,可以在OSMNavigator中参考。

在看了几个小时的代码后,我想出了这个解决方案,希望这能对你有所帮助。

代码语言:javascript
复制
ArrayList<OverlayItem> overlayItemArray; 
overlayItemArray = new ArrayList<>(); 
GeoPoint startPoint = new GeoPoint(27.6803, 85.3303);
GeoPoint destinationPoint = new GeoPoint(27.6303, 85.3203); 

现在,在overlayitem数组中添加geopoint

代码语言:javascript
复制
  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。

代码语言:javascript
复制
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设置为异步类

代码语言:javascript
复制
 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并按照教程进行操作。

票数 3
EN

Stack Overflow用户

发布于 2017-01-19 06:49:55

应避免在UI线程上执行长时间运行的操作。这包括文件和网络访问。

StrictMode允许在应用程序中设置策略,以避免做不正确的事情。例如,如果您的应用程序违反了某些Android策略,下面的设置将使其崩溃。StrictMode应该只在开发过程中使用,而不是在活动应用程序中使用。

代码语言:javascript
复制
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);

将此代码放入OnCreate方法中。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38539637

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档