我在我的android应用程序中使用osmdroid bonuspack,当我运行代码时,我得到了这个错误NetworkOnMainThread异常。
这是我的代码:
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);
}
}}
这是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)
我在这个网站上学习了教程:https://code.google.com/p/osmbonuspack/wiki/Tutorial_1
发布于 2013-11-11 17:09:54
网络请求应使用异步任务。此链接将帮助您编写Async Tasks
发布于 2013-11-11 17:11:33
自从Android Honeycomb诞生以来,为了提高应用程序的响应性,它不允许使用网络任务在"main“线程或"ui”线程上执行。当你试图在“主线程”本身上执行网络操作时,Android抛出了一个名为NetworkOnMainThreadException
的异常。
要解决此问题,您可以使用:- AsyncTask
,一个工作线程(通过扩展Thread
类,或使用Handler
的
如果要在网络连接关闭后更改UI或在网络连接正在进行时更新UI,则可以使用AsyncTask
。
如果您没有任何UI更新,则Thread
%s更好。
发布于 2013-11-11 17:17:48
应避免在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);
}
https://stackoverflow.com/questions/19902501
复制相似问题