2016-07-23 63 views
2

我下面這個教程OSMBonuspack:https://github.com/MKergall/osmbonuspack/wiki/Tutorial_1OSMBonuspack RoadManager NetworkOnMainThreadException

當我運行應用程序,我得到的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); 
    } 
} 
+1

看到https://github.com/MKergall/osmbonuspack/wiki/Tutorial_0#important-note-about-network-calls – MKer

+0

感謝您編輯教程 –

+0

@ThilinaEkanayaka請提供你如何糾正該問題的答案。 –

回答

1

你好教程上快速搜索,我想出了以下sollution後。

在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(); 

下使使法,並呼籲從方法異步中添加的GeoPoint。

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參考,並按照教程。

1

您應該避免在UI線程上執行長時間運行的操作。這包括文件和網絡訪問。

StrictMode允許在您的應用程序中設置策略以避免做錯誤的事情。例如,如果以下設置違反了某些Android策略,則會導致應用程序崩潰。 StrictMode只能在開發過程中使用,而不能在實時應用程序中使用。

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
    StrictMode.setThreadPolicy(policy); 

把這個放在OnCreate方法中。

相關問題