1

I am using osmdroid bonuspack in my android application, when I run the code I get this error NetworkOnMainThread Exception.

this is my code:

public class MainActivity extends Activity {
    private MapView myOpenMapView;
    private MapController mapController;

        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);  

            RoadManager roadManager = new OSRMRoadManager();

            myOpenMapView = (MapView) findViewById(R.id.openmapview);
            myOpenMapView.setTileSource(TileSourceFactory.MAPNIK);
            GeoPoint startPoint = new GeoPoint(48.13, -1.63);
           MapController mapController = myOpenMapView.getController();
            mapController.setCenter(startPoint);
            mapController.setZoom(9);
            ArrayList<GeoPoint> waypoints = new ArrayList<GeoPoint>();
            waypoints.add(startPoint);
            waypoints.add(new GeoPoint(48.4, -1.9)); //end point
            Road road = roadManager.getRoad(waypoints);
            PathOverlay roadOverlay = RoadManager.buildRoadOverlay(road, myOpenMapView.getContext());
            myOpenMapView.getOverlays().add(roadOverlay);
            myOpenMapView.invalidate();
         //   RoadManager roadManager = new MapQuestRoadManager();
            roadManager.addRequestOption("routeType=bicycle");


            final ArrayList<ExtendedOverlayItem> roadItems = 
                      new ArrayList<ExtendedOverlayItem>();
                    ItemizedOverlayWithBubble<ExtendedOverlayItem> roadNodes = 
                      new ItemizedOverlayWithBubble<ExtendedOverlayItem>(this, roadItems, myOpenMapView);
                    myOpenMapView.getOverlays().add(roadNodes);

                     Drawable marker = getResources().getDrawable(R.drawable.marker);
                        for (int i=0; i<road.mNodes.size(); i++){
                                RoadNode node = road.mNodes.get(i);
                                ExtendedOverlayItem nodeMarker = new ExtendedOverlayItem("Step "+i, "", node.mLocation, this);
                                nodeMarker.setMarkerHotspot(OverlayItem.HotspotPlace.CENTER);
                                nodeMarker.setMarker(marker);
                                roadNodes.addItem(nodeMarker);

                        nodeMarker.setDescription(node.mInstructions);
                        nodeMarker.setSubDescription(road.getLengthDurationText(node.mLength, node.mDuration));
                        Drawable icon = getResources().getDrawable(R.drawable.ic_launcher);
                        nodeMarker.setImage(icon);

                        }

}}

and this is the logCat:

11-11 04:00:01.916: E/AndroidRuntime(1040): FATAL EXCEPTION: main
11-11 04:00:01.916: E/AndroidRuntime(1040): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.openstreetbonus/com.example.openstreetbonus.MainActivity}: android.os.NetworkOnMainThreadException
11-11 04:00:01.916: E/AndroidRuntime(1040):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)
11-11 04:00:01.916: E/AndroidRuntime(1040):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
11-11 04:00:01.916: E/AndroidRuntime(1040):     at android.app.ActivityThread.access$600(ActivityThread.java:141)
11-11 04:00:01.916: E/AndroidRuntime(1040):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
11-11 04:00:01.916: E/AndroidRuntime(1040):     at android.os.Handler.dispatchMessage(Handler.java:99)
11-11 04:00:01.916: E/AndroidRuntime(1040):     at android.os.Looper.loop(Looper.java:137)
11-11 04:00:01.916: E/AndroidRuntime(1040):     at android.app.ActivityThread.main(ActivityThread.java:5103)
11-11 04:00:01.916: E/AndroidRuntime(1040):     at java.lang.reflect.Method.invokeNative(Native Method)
11-11 04:00:01.916: E/AndroidRuntime(1040):     at java.lang.reflect.Method.invoke(Method.java:525)
11-11 04:00:01.916: E/AndroidRuntime(1040):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
11-11 04:00:01.916: E/AndroidRuntime(1040):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
11-11 04:00:01.916: E/AndroidRuntime(1040):     at dalvik.system.NativeStart.main(Native Method)
11-11 04:00:01.916: E/AndroidRuntime(1040): Caused by: android.os.NetworkOnMainThreadException
11-11 04:00:01.916: E/AndroidRuntime(1040):     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1133)
11-11 04:00:01.916: E/AndroidRuntime(1040):     at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
11-11 04:00:01.916: E/AndroidRuntime(1040):     at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
11-11 04:00:01.916: E/AndroidRuntime(1040):     at java.net.InetAddress.getAllByName(InetAddress.java:214)
11-11 04:00:01.916: E/AndroidRuntime(1040):     at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
11-11 04:00:01.916: E/AndroidRuntime(1040):     at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
11-11 04:00:01.916: E/AndroidRuntime(1040):     at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
11-11 04:00:01.916: E/AndroidRuntime(1040):     at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
11-11 04:00:01.916: E/AndroidRuntime(1040):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
11-11 04:00:01.916: E/AndroidRuntime(1040):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
11-11 04:00:01.916: E/AndroidRuntime(1040):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
11-11 04:00:01.916: E/AndroidRuntime(1040):     at org.osmdroid.bonuspack.utils.HttpConnection.doGet(HttpConnection.java:75)
11-11 04:00:01.916: E/AndroidRuntime(1040):     at org.osmdroid.bonuspack.routing.OSRMRoadManager.getRoad(OSRMRoadManager.java:204)
11-11 04:00:01.916: E/AndroidRuntime(1040):     at com.example.openstreetbonus.MainActivity.onCreate(MainActivity.java:46)
11-11 04:00:01.916: E/AndroidRuntime(1040):     at android.app.Activity.performCreate(Activity.java:5133)
11-11 04:00:01.916: E/AndroidRuntime(1040):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
11-11 04:00:01.916: E/AndroidRuntime(1040):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175)

I followed the tutorial at this site: https://code.google.com/p/osmbonuspack/wiki/Tutorial_1

4

3 回答 3

2

您应该对网络请求使用异步任务。此链接将帮助您编写 异步任务

于 2013-11-11T09:09:53.570 回答
0

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

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

StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
    .detectAll().penaltyLog().penaltyDeath().build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectAll()
    .penaltyLog().penaltyDeath().build());

尝试如下:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main);       
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);
}
于 2013-11-11T09:17:48.327 回答
0

自 Android Honeycomb 诞生以来,为了让应用程序更具响应性,不允许使用在“主”线程或“ui”线程上执行的网络任务。当您尝试在“主”线程本身上执行网络操作时,Android 会抛出一个名为NetworkOnMainThreadException.

要解决此问题,您可以使用:- AsyncTask,工作线程(通过扩展Thread类,或使用Handlers

AsyncTask当您想在网络连接关闭后更改 UI 或在网络连接正在进行时更新 UI 时,您可以使用。

Thread如果您没有任何 UI 更新,s 会更好。

于 2013-11-11T09:11:33.313 回答