Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java OSMBonuspack道路管理器网络维护线程异常_Java_Android_Android Asynctask_Osmdroid - Fatal编程技术网

Java OSMBonuspack道路管理器网络维护线程异常

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

以下是OSMBonuspack的教程:

运行应用程序时,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);
    }
}
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);